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



我是Protobuf的新手。我需要序列化复杂的图形结构,并在C 和Python客户端之间共享。我正在尝试应用Protobuf,因为:

  • 这是语言不可知论,具有C 和Python的发电机
  • 它是二进制的。我负担不起文本格式,因为我的数据结构很大

但Protobuf用户指南说:

协议缓冲区并非设计用于处理大消息。作为一个 一般经验法则,如果您要处理的消息大于一个 每个兆字节,也许是时候考虑一种替代策略了。

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

我的图形结构有时大小高达1 GB,高于1 Mb。

为什么Protobuf不适用于序列化大型数据集?我应该使用什么?

它只是一般指导,因此不适用于每种情况。例如,OpenStreetMap项目使用基于协议缓冲的文件格式为其地图使用,并且文件通常为10-100 GB。另一个示例是Google自己的TensorFlow,它使用ProtoBuf及其存储的图表通常大小为1 GB。

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

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

如果您需要在许多语言中兼容的随机访问格式,我建议使用HDF5或sqlite。

使用大于1MB的协议缓冲区应该是可以的。我们一直在Google上做,我什至都不知道您引用的建议。

主要问题是您需要一次将整个协议缓冲区置于内存中,因此值得考虑是否最好将数据分解为较小的项目,以便您只需要拥有一部分数据一次记忆。

如果您无法分解,则不必担心。继续使用大量协议缓冲区。

最新更新