【问题标题】:CapnProto maximum filesizeCapnProto 最大文件大小
【发布时间】:2018-01-26 09:42:27
【问题描述】:

目前我们正在使用 ProtocolBuffers 在 python 和 C++ 之间交换数据。但是,我们遇到了协议缓冲区的最大文件大小限制,并且正在考虑将所有内容切换到 Cap'n Proto。但是,由于它与协议缓冲区有些相关,我想知道 Cap'n Proto 是否也对最大文件大小有限制?

【问题讨论】:

  • 我们在谈论什么样的尺寸?请注意,protobuf 可以比官方推荐的想法大得多。 capnproto 被设计为对大数据更友好,具有多板文件布局,但它没有广泛的支持 - 我想这取决于这对你是否重要
  • 我已经在使用 CodedInputStream 来读取更大的文件。但据我了解,protobuffers 的硬限制为 2GB。如果可能的话,我希望有比这更大的文件。
  • 协议没有硬性限制(嗯,有,但它涉及64位数字,所以不会有问题)。如果一个特定的实现强加了一个硬性限制,那可能是一个问题 - 理所当然。有一个 hack suggested here 关于如何绕过 C++ 版本。我运行其中一个 C# 版本,并帮助人们处理比 2GiB 大得多的文件。
  • 感谢为我指出这一点。虽然我们自己编译库并且可以调整kDefaultTotalBytesLimit,但在我们的构建过程中调整库并不是 100% 舒服的。您是否碰巧知道 Cap'n proto 是否可以开箱即用地处理更大的文件?
  • 相信可以,是的;几年前我写了一些 capnp 工具,但我有一段时间没碰过它

标签: protocol-buffers capnproto


【解决方案1】:

Cap'n Proto 的最大文件大小约为 2^64 字节或 16 exbibytes——“对于任何人来说都应该足够了”。 :)

Cap'n Proto 实际上是处理超大数据文件的绝佳格式,因为它支持随机访问和延迟加载。在读取巨大的 Cap'n Proto 文件时,我建议使用 mmap() 将文件映射到内存中,然后将字节直接传递给 Cap'n Proto 实现(例如 C++ 中的 capnp::FlatArrayMessageReader)。这样,只有您实际使用的文件页面才会被操作系统带入内存。 (相比之下,使用 Protocol Buffers,必须先将整个文件解析为内存中的数据结构,然后才能访问其中的任何一个。)

请注意,Cap'n Proto 结构中的单个 List 值限制为 2^29-1 个元素。 TextData(字符串和字节 blob)是特殊类型的列表,因此这意味着任何单个连续文本或字节 blob 都限制为 512MB。但是,您可以拥有多个这样的 blob,因此可以通过将较大的数据拆分为多个片段来将其存储到一个文件中。

另请注意,大多数 Cap'n Proto 实现默认情况下会在读取 Cap'n Proto 结构时施加“遍历限制”,以防御包含指针循环的恶意数据。通常,这默认为 64MiB。对于更大的数据,您需要覆盖限制 - 在 C++ 中,您需要将自定义 ReaderOptions 传递给 MessageReader 构造函数。

【讨论】:

  • 列表列表(即List(List(Data)))是否足以绕过 512MB 限制,还是需要明确单独的字段?
  • @Vitali List(Data) 应该足够了。列表中的每个Data 可以是512MB,外部列表中可以有2^29 - 1 个Datas。
  • 是的,我写了一个测试来确认这一点。我确实发现 writeMessageToFd 在 macos 上具有 > 2 GB 的列表会引发异常,因为该平台上的 write/writev 似乎仅限于有符号整数,但我没有机会报告它的问题(愚蠢地没有'不保存测试用例代码以使提交问题更容易)。
  • @KentonVarda 你有没有提到为什么存在 2^29-1 元素限制?我们正在尝试使用 capnp 存储许多 GB 的 3D 点云数据,并且必须拆分列表非常不方便。所以我想知道这个限制是如何形成的。特别是因为 canpn 取消了 protobuf 的一般 32 位限制,所以在 capnp 的某些部分中发现另一个类似的限制有点奇怪。
  • @nh2 这是因为列表指针的编码方式:capnproto.org/encoding.html#lists 指针编码的“D”部分是 29 位。如您所见,指针的所有位都被考虑在内,因此为了允许更大的大小,我们不得不单独存储长度(可能作为值的前缀?),这会增加小列表的开销或通过具有多个指针编码会显着复杂化规范。回想起来,增加复杂性可能是值得的,但现在很难在不破坏兼容性的情况下进行更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2015-08-04
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多