google protobuf 最大大小

google protobuf maximum size

我的 protobuf 消息中有一些重复元素。在运行时,消息的长度可以是任何长度——我看到一些问题已经被问到,比如这个——[1]:

  1. 我这里有一个稍微不同的问题。如果我的 JMS(Java 消息服务)提供商(在本例中是我的 weblogic 或 tibco jms 服务器)没有任何大小 限制最大消息大小,将协议缓冲区编译器 抱怨最大消息大小?
  2. 是否 encoding/decoding 的性能在大尺寸下表现不佳 (大约 10MB)..?
  1. 我不认为 protobuf 编译器会抱怨消息大小。至少在达到 uint64_t.

  2. 的 18 艾字节最大值之前
  3. 对于大多数实现,性能在消息无法立即装入 RAM 时开始受到影响。所以 10 MB 应该没问题,10 GB 不行。另一个可能的问题是,如果您不需要所有数据 - protobuf 不支持随机访问,因此即使您只需要其中的一部分,您也需要解码整个消息。

10MB 有点过分,但您可能没问题。

Protobuf 有 2GB 的硬性限制,因为许多实现使用 32 位有符号算法。出于安全原因,许多实现(尤其是 Google 提供的实现)默认将大小限制为 64MB,但如果需要,您可以手动增加此限制。

该实现本身不会 "slow down" 处理大消息,但问题是您必须始终立即解析整条消息,然后才能开始使用任何内容。这意味着整个消息 必须 适合 RAM(请记住,在解析后内存中的消息对象比原始序列化消息大得多),即使您只关心一个字段你必须等待整个事情被解析。

一般来说,我建议根据经验尝试将自己限制在 1MB 以内。除此之外,考虑将消息拆分为多个可以独立解析的块。然而,每个应用程序——对于某些应用程序来说,10MB 没什么大不了的,而对于其他应用程序来说,1MB 已经太大了。您必须分析自己的应用才能找到答案。

我确实见过人们乐于发送大于 1GB 的邮件的情况,所以... "works"。

附带说明一下,Cap'n Proto 的设计与 Protobuf 非常相似,但可以支持最大 2^64 字节的消息(2^32 个 4GB 段),它实际上允许您阅读消息中的一个字段而不解析整个消息(如果它在磁盘上的文件中,请使用 mmap() 以避免读取整个内容)。

(披露:我是 Cap'n Proto 以及 Google 的大部分开源 Protobuf 代码的作者。)