我是protobuf的新手。我需要序列化复杂的图形结构并在C ++和Python客户端之间共享它。 我试图申请protobuf因为:
但Protobuf用户指南说:
协议缓冲区不是为处理大型邮件而设计的。作为一个 一般的经验法则,如果你处理的信息大于a 每个兆字节,可能是考虑替代策略的时候了。
https://developers.google.com/protocol-buffers/docs/techniques#large-data
我有类似图形的结构,有时高达1 Gb,超过1 Mb。
为什么protobuf不适合序列化大型数据集?我该怎么用?
答案 0 :(得分:11)
这只是一般性指导,因此并不适用于所有情况。例如,OpenStreetMap项目为其映射使用基于协议缓冲区的文件格式,文件大小通常为10-100 GB。另一个例子是Google自己的TensorFlow,它使用protobuf,它存储的图形通常最大为1 GB。
但是,OpenStreetMap没有将整个文件作为单个消息。相反,它由数千条单独的消息组成,每条消息都编码一部分地图。您可以应用类似的方法,以便每条消息仅对例如一个节点。
protobuf对大文件的主要问题是它不支持随机访问。即使您只想访问特定项目,也必须阅读整个文件。如果您的应用程序无论如何都要将整个文件读取到内存中,这不是问题。这就是TensorFlow所做的,它似乎将所有内容存储在一条消息中。
如果你需要一种兼容多种语言的随机访问格式,我建议使用HDF5或sqlite。
答案 1 :(得分:9)
使用远大于1MB的协议缓冲区应该没问题。我们一直在谷歌这样做,我甚至都不知道你引用的建议。
主要问题是您需要立即将整个协议缓冲区反序列化到内存中,因此值得考虑一下您的数据是否会更好地分解为更小的项目,这样您只需拥有部分数据在记忆中一次。
如果你不能分手,那就不用担心了。继续使用大量协议缓冲区。