非常快速的序列化。随机访问C ++

时间:2012-04-30 16:20:41

标签: c++ serialization c++11

我可以使用什么来快速将数据序列化为C ++ 11中的多个文件(为了避免数据冗余,我假设我会将数据分成几个表并将它们连接到其ID号上)?

我考虑使用:

  1. 使用fstream.read()fstream.write()
  2. 访问的简单二进制文件
  3. 使用mmap
  4. 函数google protobuf(如果我可以访问随机元素而不是迭代所有元素)。
  5. 所有表都包含以下数据类型的列: uint8uint16uint32uint64string

3 个答案:

答案 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

支持