目前我们正在使用 ProtocolBuffers 在 python 和 C++ 之间交换数据。然而,我们遇到了协议缓冲区的最大文件大小限制,并正在考虑将所有内容切换到 Cap'n Proto。但是,由于它与协议缓冲区有些相关,我想知道Cap'n Proto 工具是否对最大文件大小有限制?
Cap'n Proto 的最大文件大小约为 2^64 字节,即 16 艾字节——这“对任何人来说都应该足够了”。 :)
事实上,Cap'n Proto 是一种非常适合超大数据文件的格式,因为它支持随机访问和延迟加载。当读取巨大的 Cap'n Proto 文件时,我建议使用mmap()
将文件映射到内存中,然后将字节直接传递给 Cap'n Proto 实现(例如capnp::FlatArrayMessageReader
在 C++ 中)。这样,操作系统只会将您实际使用的文件页面放入内存中。 (相比之下,使用 Protocol Buffers,必须先将整个文件解析为内存中的数据结构,然后才能访问其中的任何一个。)
请注意,一个人List
Cap'n Proto 结构中的值限制为 2^29-1 个元素。Text
and Data
(字符串和字节 blob)是特殊类型的列表,因此这意味着任何单个连续文本或字节 blob 的大小限制为 512MB。但是,您可以拥有多个此类 blob,因此可以通过将较大的数据分成多个片段来将其存储到单个文件中。
另请注意,大多数 Cap'n Proto 实现在读取 Cap'n Proto 结构时默认会施加“遍历限制”,以防御包含指针循环的恶意数据。通常默认为 64MiB。对于更大的数据,您需要覆盖限制——在 C++ 中,您需要传递一个自定义的ReaderOptions
to the MessageReader
构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)