Protocol buffers google protobuf最大大小

Protocol buffers google protobuf最大大小,protocol-buffers,Protocol Buffers,我的protobuf消息中有一些重复的元素。在运行时,消息的长度可以是任意长度-我看到一些问题已经被问到了,像这样-[1]: 我有一个稍微不同的问题。如果我的JMS(Java消息传递服务)提供程序(在本例中是我的weblogic或tibco JMS服务器)没有任何大小 限制最大消息大小,将使用协议缓冲区编译器 是否抱怨最大邮件大小 是吗 在大容量情况下,编码/解码性能会受到严重影响 (大约10MB) 我认为protobuf编译器永远不会抱怨消息大小。至少在达到uint64\u t的最大值18 E

我的protobuf消息中有一些重复的元素。在运行时,消息的长度可以是任意长度-我看到一些问题已经被问到了,像这样-[1]:

  • 我有一个稍微不同的问题。如果我的JMS(Java消息传递服务)提供程序(在本例中是我的weblogic或tibco JMS服务器)没有任何大小 限制最大消息大小,将使用协议缓冲区编译器 是否抱怨最大邮件大小
  • 是吗 在大容量情况下,编码/解码性能会受到严重影响 (大约10MB)
  • 我认为protobuf编译器永远不会抱怨消息大小。至少在达到
    uint64\u t
    的最大值18 EB之前

  • 对于大多数实现,当消息不能立即放入RAM时,性能开始受到影响。所以10MB应该可以,10GB不行。另一个可能的问题是,如果您不需要所有的数据,protobuf不支持随机访问,因此您需要解码整个消息,即使您只需要其中的一部分


  • 10MB正在推动它,但您可能会没事

    Protobuf有2GB的硬限制,因为许多实现使用32位有符号算术。出于安全原因,许多实现(特别是谷歌提供的实现)默认情况下都会设置64MB的大小限制,不过如果需要,您可以手动增加此限制

    对于大型消息本身,实现不会“减慢”,但问题是,在开始使用任何内容之前,必须始终同时解析整个消息。这意味着整个消息必须装入RAM(请记住,在解析内存中的消息对象后,它们比原始序列化消息大得多),即使您只关心一个字段,也必须等待整个消息被解析

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

    事实上,我见过人们乐于发送大于1GB的消息的情况,所以。。。它“有效”

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


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

    @MuditJain解析器将分配第二个字节数组,并将消息中的字节复制到该字节数组中。副本应该很快,但仍然是副本。如果改为先编写protobuf,再编写字节数组(而不将字节数组放入消息本身),可能会使其更快,但更不方便。您应该衡量性能并决定是否需要更快。Protobuf不是自定界的,因此您仍然需要在每条消息之前写入一个大小。顺便说一下,对于嵌入在消息中的大型二进制blob的用例,Cap'n Proto比Protobuf工作得更好,因为它是零拷贝。如果您使用的语言有一个很好的Cap'n Proto实现,您可能想试试。@KentonVarda“出于安全原因,许多实现(特别是谷歌提供的实现)默认设置了64MB的大小限制”-您能详细说明这些安全原因吗?@yishaiz First,解析对象的内存使用量远远大于原始消息的大小。如果你让人们给你发送任何大小的消息,他们可能会给你发送一条非常大的消息,当解析时,它会耗尽你的内存并使你的服务崩溃。第二,Protobuf实现在许多地方使用32位整数,因此重要的是大小不能太大以至于溢出32位整数。@Lobo您可以编写一个Protobuf解码器,它接受部分消息,当然。事实上,我认为他们中的许多人已经这样做了。例如,如果消息截断,C++分析器将返回false,但是所有的数据直到消息结束时都将被解析,并且将在消息对象中可用。(请注意,我已经10年没有使用Protobuf了,所以如果你要求添加新功能,那你问错人了。)