我的protobuf消息中有一些重复元素。在运行时,消息的长度可以是任何东西 - 我看到一些已经问过的问题 - [1]:Maximum serialized Protobuf message size
答案 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)
我不认为protobuf编译器会抱怨邮件大小。至少达到18艾字节uint64_t
的最高值。
对于大多数实现,性能开始受到消息无法立即适应RAM的影响。所以10 MB应该没问题,10 GB不行。另一个可能的问题是,如果您不需要所有数据 - protobuf不支持随机访问,那么即使您只需要部分数据,也需要解码整个消息。