protocol-buffers - Google Protocol Buffer 的典型内存空间使用情况是多少?

标签 protocol-buffers

我正在研究一个小型设备,该设备具有相当大的一组配置参数(~100 KB),这些参数是从 PC 软件生成的。过去,我们将参数存储在二进制文件中并将它们加载到数据结构中。维护有点烦人(不同的语言,确保结构中字段的顺序匹配,不同的版本等),所以我们正在考虑使用谷歌 Protocol Buffer 。

从小型设备的角度来看,我担心存储序列化 Protocol Buffer 所需的内存空间。我在 C 语言中工作,所以我下载了 protobuf-embedded-c并开始研究一个例子。我对它计算的缓冲区的最大大小感到有些惊讶。例如,下面是一个空缓冲区的大小,然后是包含指定类型的单个变量的缓冲区:

#define MAX_M_Empty_SIZE 2
#define MAX_M_double_SIZE 12
#define MAX_M_float_SIZE 8
#define MAX_M_int32_SIZE 14
#define MAX_M_int64_SIZE 14
#define MAX_M_uint32_SIZE 9
#define MAX_M_uint64_SIZE 14
#define MAX_M_sint32_SIZE 9
#define MAX_M_sint64_SIZE 14
#define MAX_M_fixed32_SIZE 8
#define MAX_M_fixed64_SIZE 12
#define MAX_M_sfixed32_SIZE 8
#define MAX_M_sfixed64_SIZE 12
#define MAX_M_bool_SIZE 5

每次我向结构中添加一个 'int32' 时,最大大小增加了 14 个字节。我知道这包括 key ,并且可能是 Variant 编码的最坏情况,但我能期待什么?较大的消息是否比较小的消息更有效,还是更依赖于编码值?

总之,我只是想了解 Protocol Buffer 上的内存空间使用情况。我讨厌为了存储配置数据所需的内存空间的大量增加而牺牲易用性。谢谢!

最佳答案

int32写为 varint,这意味着对于正值,它占用的空间取决于大小。小的正值可以是单字节的;更大的正值可能需要更多。负值占用更多空间 - 特别是,它与非常大的 占用相同的空间64 位 号。 “varint”是 7 位加延续;所以一个负数(或一个很大的正数)可能需要 10 个字节。为了避免这种情况,如果你知道你的值可能是负数,你可以使用 sint32/sint64 - 这使用 zig-zag 编码(然后是 varint) - 这基本上使 变小震级 值比大值占用更少的空间 震级 值(不考虑符号)。

如果您需要针对最坏情况进行优化,那么可以考虑使用 fixed32/fixed64相反;这保证正好占用 4 或 8 个字节。

总结:

  • 总是(或几乎总是)积极的,通常是小到中等大小:int32/int64
  • 正或负,通常为中小量级:sint32/sint64
  • 大值,或需要保证大小:fixed32/fixed64

  • 还有其他一些;完整的详细信息在 language guide

    (在上述所有情况下,您还需要包含标题,但通常为 1 或 2 个字节)

    关于protocol-buffers - Google Protocol Buffer 的典型内存空间使用情况是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13367526/

    相关文章:

    c++ - 如何使用 ZMQ 发送/接收使用 Protocol Buffers 序列化的二进制数据

    javascript - JavaScript 的 Protocol Buffer ?

    java - Java中用于解析文本格式的 Protocol Buffer `ParseFromString`?

    protocol-buffers - Protobuf C# 消息翻译为 JAVA

    c++ - 如何使用 Protocol Buffers 将数据从 C++ 传输到 C#

    java - 如何在没有 proto 文件的情况下反序列化 protobuf?

    postgresql - 使用 Gorm 在 Go 中返回一个数组

    json - JSON RPC 与 HTTP2 与 grpc 有什么区别?

    c# - Protocol Buffer ,让 C# 与 C++ 对话 : type issues and schema issues

    python - memcached 中对象的最佳序列化方法是什么?