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

标签 python c++ protocol-buffers

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

  • 它与语言无关,具有 C++ 和 Python 的生成器
  • 它是二进制的。我买不起文本格式,因为我的数据结构很大

但是 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 项目为其 map 使用基于 Protocol Buffer 的文件格式,文件大小通常为 10-100 GB。另一个例子是 Google 自己的 TensorFlow,它使用 protobuf,它存储的图形通常大小高达 1 GB。

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

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

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

关于python - 为什么 protobuf 不适合大型数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564437/

相关文章:

python - SQLAlchemy 中是否有等效的 LISTAGG WITHIN GROUP?

python - 应用程序的每个模块都需要 Flask 实例化吗?

C++ 分配 vector 所花费的时间

java - 在 gRPC 中跨不同类型的对象复制字段

c# - C# 中的 Google Protocol Buffer

python - Sklearn LinearSVC 库中惩罚和损失参数的区别

python - 使用Python登录网站并进行网络抓取

c++ - 将 float vector 转换为十六进制/二进制字符串

c++ - float 学运算后舍入不一致

python - 在python中使用谷歌的protobuf而不安装它