google protobuf最大尺寸

时间:2015-12-07 08:02:23

标签: protocol-buffers

我的protobuf消息中有一些重复元素。在运行时,消息的长度可以是任何东西 - 我看到一些已经问过的问题 - [1]:Maximum serialized Protobuf message size

  1. 我的问题略有不同。如果我的JMS(Java Messaging服务)提供程序(在本例中是我的weblogic或tibco jms服务器)没有任何大小 限制最大消息大小,将协议缓冲编译器 总是抱怨最大邮件大小?
  2. 是吗? 编码/解码的性能在大尺寸下可怕 (约10MB左右)..?

2 个答案:

答案 0 :(得分:38)

10MB正在推动它,但你可能会没事。

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

对于大型邮件本身,实现不会“减速”,但问题是您必须始终先解析整个邮件,然后才能开始使用任何内容。这意味着整个消息必须适合RAM(请记住,解析内存中的消息对象比原始序列化消息大得多),即使您只关心一个字段,等待整个事情解析。

通常我建议尝试将自己限制为1MB作为经验法则。除此之外,考虑将消息拆分为多个可以独立解析的块。但是,每个应用程序 - 对于一些应用程序来说,10MB并不是什么大问题,对于其他应用程序来说1MB已经太大了。您需要对自己的应用进行分析才能找到答案。

我实际上已经看到人们很乐意发送大于1GB的邮件,所以......它“有效”。

另一方面,Cap'n Proto与Protobuf的设计非常相似,但可以支持最多2 ^ 64字节的消息(每个4GB的2 ^ 32段),它实际上允许您读取一个字段从消息中解析整个消息(如果它在磁盘上的文件中,请使用mmap()以避免读取整个消息)。

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

答案 1 :(得分:3)

  1. 我不认为protobuf编译器会抱怨邮件大小。至少达到18艾字节uint64_t的最高值。

  2. 对于大多数实现,性能开始受到消息无法立即适应RAM的影响。所以10 MB应该没问题,10 GB不行。另一个可能的问题是,如果您不需要所有数据 - protobuf不支持随机访问,那么即使您只需要部分数据,也需要解码整个消息。