Protocol buffers Google协议缓冲区的典型内存空间使用情况是什么?

Protocol buffers Google协议缓冲区的典型内存空间使用情况是什么?,protocol-buffers,Protocol Buffers,我在一个小型设备上工作,它有一组相当大的配置参数(~100KB),这些参数是由PC软件生成的。过去,我们将参数存储在二进制文件中,并将其加载到数据结构中。维护有点烦人(不同的语言,确保结构中字段的顺序匹配,不同的版本等等),所以我们考虑使用Google协议缓冲区 从小型设备的角度来看,我关心存储序列化协议缓冲区所需的内存空间。我用C语言工作,所以我下载并开始编写一个示例。我有点惊讶于它计算的最大缓冲区大小。例如,下面是空缓冲区的大小,然后是包含命名类型的单个变量的缓冲区: #define MAX

我在一个小型设备上工作,它有一组相当大的配置参数(~100KB),这些参数是由PC软件生成的。过去,我们将参数存储在二进制文件中,并将其加载到数据结构中。维护有点烦人(不同的语言,确保结构中字段的顺序匹配,不同的版本等等),所以我们考虑使用Google协议缓冲区

从小型设备的角度来看,我关心存储序列化协议缓冲区所需的内存空间。我用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个字节。我知道这包括密钥,而且可能是变体编码的最坏情况,但是我能期待什么呢?较大的消息比较小的消息更有效,还是更依赖于编码值


总之,我只是想了解一下协议缓冲区上的内存空间使用情况。我不愿意以易用性换取存储配置数据所需的内存空间的大幅增加。谢谢

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

如果需要优化最坏情况,则可以考虑使用<代码> FixEd3/<代码> FixED64 ;这保证了只需要4或8个字节

总结:

  • 始终(或几乎始终)为正值,通常为小到中等大小:
    int32
    /
    int64
  • 正或负,通常为小到中等量级:
    sint32
    /
    sint64
  • 大值,或需要保证大小:
    fixed32
    /
    fixed64
还有一些其他的;详情请参阅


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

Nanopb可以使用非常小的内存空间,并且它还可以直接序列化到文件或从文件中序列化,以避免需要内存缓冲区: