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