C++ 非常快的序列化。随机存取C++;
在C++11中,我可以使用什么来执行数据到多个文件的快速序列化(为了避免数据冗余,我假设我会将数据拆分为多个表,并根据其id号将它们连接起来) 我考虑使用:C++ 非常快的序列化。随机存取C++;,c++,serialization,c++11,C++,Serialization,C++11,在C++11中,我可以使用什么来执行数据到多个文件的快速序列化(为了避免数据冗余,我假设我会将数据拆分为多个表,并根据其id号将它们连接起来) 我考虑使用: 使用fstream.read(),fstream.write()访问的简单二进制文件 使用mmap 函数googleprotobuf(如果我可以访问随机元素而不是遍历所有元素) 所有表将由具有以下数据类型的列组成: uint8,uint16,uint32,uint64,string,快速随机访问将是这里的挑战。实现这一点的最简单方法是保持每
fstream.read()
,fstream.write()
访问的简单二进制文件mmap
李>
protobuf
(如果我可以访问随机元素而不是遍历所有元素)uint8
,uint16
,uint32
,uint64
,string
,快速随机访问将是这里的挑战。实现这一点的最简单方法是保持每行大小不变。使用protobuf
s实现这一点并不容易,除非您假定一个保守的最大大小。使用前两个选项中的任何一个都应该相对容易做到这一点(假设您对字符串的大小有一个合理的限制)
然而,你可以任意地变得更复杂。使用protobuf
s可能比简单的序列化使用更少的空间,因此您将有剩余的内存来构建索引。即使是一个相对较小的索引(例如,每100行从一个表行号映射到一个文件偏移量),也可以提供快速的随机访问,并使用更少的空间。当然,这比简单的“每行大小相同”方法要复杂得多。快速随机访问将是这里的挑战。实现这一点的最简单方法是保持每行大小不变。使用protobuf
s实现这一点并不容易,除非您假定一个保守的最大大小。使用前两个选项中的任何一个都应该相对容易做到这一点(假设您对字符串的大小有一个合理的限制)
然而,你可以任意地变得更复杂。使用protobuf
s可能比简单的序列化使用更少的空间,因此您将有剩余的内存来构建索引。即使是一个相对较小的索引(例如,每100行从一个表行号映射到一个文件偏移量),也可以提供快速的随机访问,并使用更少的空间。当然,这比简单的“每行大小相同”方法要复杂得多。分隔数字和字符串存储
稀疏表、数字数据
对数字类型的列使用列存储。列存储不存储空值,并提供连接逻辑,允许您复制表行
不是单次查找随机访问,而是空间折衷可能获胜,特别是如果列存储的索引保留在内存中
密集表格、数字数据
MMAP用于读取的文件。以恒定宽度按行存储数据。您可能需要调整文件打开参数以获得所需的缓存和预读优势
使用fstream.write()进行编写可能会更快
字符串数据
根据您的建议,听起来您的设计允许一次写入所有表,然后从此点开始执行只读随机访问。如果是这样的话,请看。它是一个存储层,为可变长度数据提供有效的随机访问。将数字和字符串存储分开
稀疏表、数字数据
对数字类型的列使用列存储。列存储不存储空值,并提供连接逻辑,允许您复制表行
不是单次查找随机访问,而是空间折衷可能获胜,特别是如果列存储的索引保留在内存中
密集表格、数字数据
MMAP用于读取的文件。以恒定宽度按行存储数据。您可能需要调整文件打开参数以获得所需的缓存和预读优势
使用fstream.write()进行编写可能会更快
字符串数据
根据您的建议,听起来您的设计允许一次写入所有表,然后从此点开始执行只读随机访问。如果是这样的话,请看。它是一个存储层,为可变长度数据提供高效的随机访问。麻省理工学院许可的序列化库可能提供您需要的功能。它是由谷歌Protobuf的主要作者肯顿·瓦尔达撰写的
他说的一句话:
Cap'n Proto使用指针支持完全随机访问。这意味着您可以在不实际处理整个内容的情况下执行类似于mmap()的操作,例如创建一个巨大的文件并拉出一个内部对象,或者以与写入子对象不同的顺序访问子对象
您提到的数据类型(uint8、uint16、uint32、uint64、string)都受支持。麻省理工学院许可的序列化库可能提供您需要的功能。它是由谷歌Protobuf的主要作者肯顿·瓦尔达撰写的
他说的一句话:
Cap'n Proto使用指针支持完全随机访问。这意味着您可以在不实际处理整个内容的情况下执行类似于mmap()的操作,例如创建一个巨大的文件并拉出一个内部对象,或者以与写入子对象不同的顺序访问子对象
您提到的数据类型(uint8、uint16、uint32、uint64、string)都受序列化的支持,I/O是不同的。当你必须处理文件时,我不会太担心序列化速度。我的第一个倾向是考虑。SQLite不是一个选项,当我必须处理很多数据时(SQLite文件大约有8GB)。你看过@ MikCalOL:我不知道SQLite有一个文件大小限制那么小。事实上,我很确定它说1Tera页面是默认的最大大小。一个页面是几个字节;我不知道有多少,但如果是1KB,那就是1024 TB-