减少 Protocol Buffers 消息大小的选项
Options for reducing Protocol Buffers's Message size
我想将对象序列化为数据,并尽可能减小序列化数据的大小,目前我正在测试 Protocol Buffers。
我已经阅读了 official encoding doc,并且对 varint 数字做了一些优化,除此之外,我还可以做任何其他优化来减少消息大小吗?
这里有一些建议,假设您使用的是 proto3
格式。
太多的大小优化可能不值得-这些都会影响生成的代码and/or需要提前知道字段值的范围/分布。
- 尽可能使用最小的数据类型
- 避免writing negative integers as
int32
/int64
,如果字段经常为负数,编码为sint32
/sint64
- 尽可能避免固定长度字段(
fixed64
、sfixed64
、double
、fixed32
、sfixed32
、float
)。
- 对于 varint 编码类型(
int32
、int64
、uint32
、uint64
、sint32
、sint64
、bool
, enum
),默认值(0 或 false)将从序列化数据中省略 - 如果可能,使用它来表示 null/missing 值。
- 如果
bool
字段大部分是 true
,请反转字段的含义以在更多情况下使用默认值。
- 最小化 size/number 嵌入式消息
- 尽可能避免嵌套消息(例如,
Int32Value
之类的“包装”类型用于可空字段)- 这些需要额外的 embedded message 以及数据。
- 字段标签编号 written alongside data 为
varint
- 标签 1-15 占用一个字节,16-2047 占用 2 个字节。因此,为常用字段保留标签 1-15,并给 optional/rarely 使用的字段更高的标签编号。
- 要可视化您的消息有多少标签嵌套,请将序列化数据通过管道传输到
protoc --decode_raw
。
- 如果可以,请在序列化后压缩消息
我想将对象序列化为数据,并尽可能减小序列化数据的大小,目前我正在测试 Protocol Buffers。
我已经阅读了 official encoding doc,并且对 varint 数字做了一些优化,除此之外,我还可以做任何其他优化来减少消息大小吗?
这里有一些建议,假设您使用的是 proto3
格式。
太多的大小优化可能不值得-这些都会影响生成的代码and/or需要提前知道字段值的范围/分布。
- 尽可能使用最小的数据类型
- 避免writing negative integers as
int32
/int64
,如果字段经常为负数,编码为sint32
/sint64
- 尽可能避免固定长度字段(
fixed64
、sfixed64
、double
、fixed32
、sfixed32
、float
)。 - 对于 varint 编码类型(
int32
、int64
、uint32
、uint64
、sint32
、sint64
、bool
,enum
),默认值(0 或 false)将从序列化数据中省略 - 如果可能,使用它来表示 null/missing 值。 - 如果
bool
字段大部分是true
,请反转字段的含义以在更多情况下使用默认值。
- 避免writing negative integers as
- 最小化 size/number 嵌入式消息
- 尽可能避免嵌套消息(例如,
Int32Value
之类的“包装”类型用于可空字段)- 这些需要额外的 embedded message 以及数据。 - 字段标签编号 written alongside data 为
varint
- 标签 1-15 占用一个字节,16-2047 占用 2 个字节。因此,为常用字段保留标签 1-15,并给 optional/rarely 使用的字段更高的标签编号。 - 要可视化您的消息有多少标签嵌套,请将序列化数据通过管道传输到
protoc --decode_raw
。
- 尽可能避免嵌套消息(例如,
- 如果可以,请在序列化后压缩消息