c++ - 优化模拟的 flatbuffer 字典

标签 c++ flatbuffers

我的 FlatBuffers 架构文件 dict.fbs 如下所示:

namespace fbs;

table Dict {
    entries:[DictEntry];
}

table DictEntry {
    key:string (key);
    value:string;
}

root_type Dict;

现在根据文档,您可以在 Flatbuffers 中使用这样的排序 vector 和二进制查找来模拟字典

flatbuffers::FlatBufferBuilder builder(1024);

std::string key, value; 
std::ifstream infile(argv[1]);
std::string outfile(argv[2]);

std::vector<flatbuffers::Offset<DictEntry>> entries;

while (std::getline(infile, key) && std::getline(infile, value)) {
    entries.push_back(CreateDictEntryDirect(builder, key.c_str(), value.c_str()));
}

auto vec = builder.CreateVectorOfSortedTables(&entries);
auto dict = CreateDict(builder, vec);

builder.Finish(dict);

我的原始单词列表在磁盘上有 32MB。现在对于这个列表中的每个单词,我都有一个规范化的 key 和一个相应的 value。如果序列化的 flatbuffer dict 现在在磁盘上有两倍的大小,比如 64MB,那将是合乎逻辑的,但实际上输出是 111MB

我可以优化此架构以使其更紧凑吗?是什么将输出放大到几乎 4 倍?

最佳答案

字符串是否相对较小?平均长度是多少?

您的开销将是:2 个字符串,每个字符串都有一个 32 位长度的字段,以及可能的填充。然后每个 DictEntry 12 个字节(vtable 偏移量 + 2 个字符串偏移量)。然后是 vector 中的另一个 32 位偏移量。所以是的,如果字符串很小,则可以将大小增加那么多。

请注意,如果您使用了 std::map<std::string, std::string>您最终可能会使用更多内存。

我建议您使用 FlexBuffers ( https://google.github.io/flatbuffers/flexbuffers.html) 尝试同样的事情,它具有更紧凑的字符串表示形式,并且对于您的目的应该是相同的速度(因为您的数据无论如何都是“字符串类型的”)。

关于c++ - 优化模拟的 flatbuffer 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47388994/

相关文章:

c++ - 如何获得表格的大小

C++ Lambda 导致 'candidate function not viable:'

c++ - 用OpenGL画圆

c++ - 没有目录路径的CMake glob文件列表

c# - 尝试从 flatbuffer 的二进制文件访问 "LengthofTable"时出现 SystemAccessOutOfbound 异常

linux - 如何在 linux ubuntu 上安装 flatc 和 flatbuffers

c++ - C++ 编译器会通过 `reference` 优化掉未使用的返回值吗?

c++ - 无法理解这个 C++ 程序的返回值

go - 使用 FlatBuffers 更快地发送/写入 Float32 数组

c++ - FlatBuffers 的多语言集成问题