我可以使用什么来快速将数据序列化为C ++ 11中的多个文件(为了避免数据冗余,我假设我会将数据分成几个表并将它们连接到其ID号上)?
我考虑使用:
fstream.read()
,fstream.write()
。mmap
。 protobuf
(如果我可以访问随机元素而不是迭代所有元素)。所有表都包含以下数据类型的列:
uint8
,uint16
,uint32
,uint64
,string
。
答案 0 :(得分:1)
快速随机访问将成为挑战。实现这一目标的最简单方法是保持每行的大小不变。除非您假设保守的最大大小,否则使用protobuf
s并没有简单的方法。使用前两个选项中的任何一个都应该相对容易(假设您对字符串的大小有合理的限制)。
然而,你可能会变得更加复杂。使用protobuf
s可能会比天真序列化使用更少的空间,因此您将留下内存来构建索引。即使是相对较小的索引(例如,从表行号映射到每第100行的文件偏移量),也可以为您提供快速随机访问并使用更少的空间。当然,这比简单的每行是同样大小的方法要复杂得多。
答案 1 :(得分:1)
分隔您的数字和字符串存储空间。
稀疏表,数字数据
将列存储用于数字类型列。列存储不存储NULL值,并提供允许重现表行的连接逻辑。
不是单一查找随机访问,但空间权衡可能会赢,特别是如果列存储的索引保留在内存中。
密集表,数字数据
MMAP一个文件供阅读。以恒定宽度逐行存储数据。您可能必须调整文件打开参数以获得所需的缓存和预读优势。
使用fstream.write()进行写作可能会更快。
字符串数据
根据您的建议,听起来您的设计允许一次写入表格,然后从该点开始执行只读随机访问。如果是,请查看Google's SSTable。它是一个存储层,为可变长度数据提供有效的随机访问。
答案 2 :(得分:1)
MIT许可的序列化库 Cap’n Proto 可能会提供您所需的功能。它由Google Protobuf Kenton Varda 的主要作者撰写。
他的quote: Cap'n Proto使用指针来支持完全随机访问。这意味着您可以执行mmap()这样一个巨大的文件,并在不实际处理整个内容的情况下拉出一个内部对象,或者以与编写时不同的顺序访问子对象
您提及的数据类型(uint8,uint16,uint32,uint64,string)均受Cap'n Proto Schema Language
支持