优化模拟的FlatBuffer词典



我的flatbuffers架构文件 dict.fbs看起来像这样:

namespace fbs;
table Dict {
    entries:[DictEntry];
}
table DictEntry {
    key:string (key);
    value:string;
}
root_type Dict;

现在,根据文档,您可以在带有分类向量和二进制查找的Flatbuffer中模仿词典

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个字符串偏移)。然后在向量中另外32位抵消了。所以是的,如果字符串很小,则可能会增加尺寸。

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

我建议您尝试使用flexbuffers(https://google.github.io/flatbuffers/flexbuffers.html),它具有更紧凑的字符串表示形式,而为您的目的应该是相同的速度(因为您无论如何,数据是"诱人的")。

最新更新