为什么protobuf对大型数据结构不利?

时间:2017-11-30 01:18:36

标签: python c++ protocol-buffers

我是protobuf的新手。我需要序列化复杂的图形结构并在C ++和Python客户端之间共享它。 我试图申请protobuf因为:

  • 它与语言无关,具有C ++和Python的生成器
  • 是二进制的。我无法承受文本格式,因为我的数据结构非常大

但Protobuf用户指南说:

  

协议缓冲区不是为处理大型邮件而设计的。作为一个   一般的经验法则,如果你处理的信息大于a   每个兆字节,可能是考虑替代策略的时候了。

https://developers.google.com/protocol-buffers/docs/techniques#large-data

我有类似图形的结构,有时高达1 Gb,超过1 Mb。

为什么protobuf不适合序列化大型数据集?我该怎么用?

2 个答案:

答案 0 :(得分:11)

这只是一般性指导,因此并不适用于所有情况。例如,OpenStreetMap项目为其映射使用基于协议缓冲区的文件格式,文件大小通常为10-100 GB。另一个例子是Google自己的TensorFlow,它使用protobuf,它存储的图形通常最大为1 GB。

但是,OpenStreetMap没有将整个文件作为单个消息。相反,它由数千条单独的消息组成,每条消息都编码一部分地图。您可以应用类似的方法,以便每条消息仅对例如一个节点。

protobuf对大文件的主要问题是它不支持随机访问。即使您只想访问特定项目,也必须阅读整个文件。如果您的应用程序无论如何都要将整个文件读取到内存中,这不是问题。这就是TensorFlow所做的,它似乎将所有内容存储在一条消息中。

如果你需要一种兼容多种语言的随机访问格式,我建议使用HDF5或sqlite。

答案 1 :(得分:9)

使用远大于1MB的协议缓冲区应该没问题。我们一直在谷歌这样做,我甚至都不知道你引用的建议。

主要问题是您需要立即将整个协议缓冲区反序列化到内存中,因此值得考虑一下您的数据是否会更好地分解为更小的项目,这样您只需拥有部分数据在记忆中一次。

如果你不能分手,那就不用担心了。继续使用大量协议缓冲区。