为什么Protobuf对大型数据结构不利
Why protobuf is bad for large data structures?
我是Protobuf的新手。我需要序列化复杂的图形结构,并在C 和Python客户端之间共享。我正在尝试应用Protobuf,因为:
- 这是语言不可知论,具有C 和Python的发电机
- 它是二进制的。我负担不起文本格式,因为我的数据结构很大
但Protobuf用户指南说:
协议缓冲区并非设计用于处理大消息。作为一个 一般经验法则,如果您要处理的消息大于一个 每个兆字节,也许是时候考虑一种替代策略了。
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上做,我什至都不知道您引用的建议。
主要问题是您需要一次将整个协议缓冲区置于内存中,因此值得考虑是否最好将数据分解为较小的项目,以便您只需要拥有一部分数据一次记忆。
如果您无法分解,则不必担心。继续使用大量协议缓冲区。
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 在 lldb 中为大型数据结构设置观察点
- 适用于频繁更改的大型数据集的最佳数据结构
- 为什么Protobuf对大型数据结构不利
- 高速缓存行检索和在大型数据结构上的性能
- 使用固定指针将大型数据结构传递给非托管代码
- 用于存储大型数据集的数据结构
- 如何在C++中编码大型复杂、恒定的数据结构
- 适合大型图形的数据结构
- C++在MPI进程之间共享大型数组和数据结构
- 在c++循环中,重用大型数据结构并重置内容或分配新的,这样更快
- 在不频繁更新的大型共享数据结构上预测计算潜在需要的值
- 如何有效地返回大型数据结构
- Boost python:将大型数据结构传递给python