热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么protobuf对大型数据结构不利?》经验,为你挑选了2个好方法。

我是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的协议缓冲区应该没问题.我们一直在谷歌这样做,我甚至都不知道你引用的建议.

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

如果你不能分手,那就不用担心了.继续使用大量协议缓冲区.


推荐阅读
author-avatar
nicknick-AUG
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有