为什么 protobuf 不适合大型数据结构?

Why protobuf is bad for large data structures?

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

但是 Protobuf 用户指南说:

Protocol Buffers are not designed to handle large messages. As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.

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 一直这样做,我什至不知道你引用的建议。

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

如果你不能打破它,那就不用担心。继续使用大量协议缓冲区。