Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非常快的序列化。随机存取C++;_C++_Serialization_C++11 - Fatal编程技术网

C++ 非常快的序列化。随机存取C++;

C++ 非常快的序列化。随机存取C++;,c++,serialization,c++11,C++,Serialization,C++11,在C++11中,我可以使用什么来执行数据到多个文件的快速序列化(为了避免数据冗余,我假设我会将数据拆分为多个表,并根据其id号将它们连接起来) 我考虑使用: 使用fstream.read(),fstream.write()访问的简单二进制文件 使用mmap 函数googleprotobuf(如果我可以访问随机元素而不是遍历所有元素) 所有表将由具有以下数据类型的列组成: uint8,uint16,uint32,uint64,string,快速随机访问将是这里的挑战。实现这一点的最简单方法是保持每

在C++11中,我可以使用什么来执行数据到多个文件的快速序列化(为了避免数据冗余,我假设我会将数据拆分为多个表,并根据其id号将它们连接起来)

我考虑使用:

  • 使用
    fstream.read()
    fstream.write()
    访问的简单二进制文件
  • 使用
    mmap
  • 函数google
    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-