编码的 nanopb 协议缓冲区消耗的内存比预期的多
Encoded nanopb protocol buffer consumes more memory than expected
我正在尝试转换以下 C 结构:
typedef struct _algo_stream_debug_pkt {
uint16_t src;
uint16_t dest;
uint16_t length;
uint16_t crc;
uint8_t command;
uint8_t status;
uint16_t sequence_num;
uint32_t timestamp;
uint16_t data_state;
uint16_t algo_out_x1;
uint16_t algo_out_x2;
uint16_t algo_out_x2;
uint16_t algo_interval;
uint16_t debug_info[10];
} algo_stream_debug_pkt ;
使用以下 .proto 文件到协议缓冲区:
message m_header {
required int32 src = 1;
required int32 dst = 2;
required int32 len = 3;
required int32 crc = 4;
}
message algo_stream_debug_pkt {
required m_header header = 1;
required int32 command = 2;
required int32 status = 3;
required int32 sequence_num = 4;
required int32 timestamp = 5;
required int32 data_state = 6;
required int32 algo_out_x1 = 7;
required int32 algo_out_x2 = 8;
required int32 algo_out_x3 = 9;
required int32 algo_interval = 10;
repeated int32 debug_info = 11;
}
和以下 .option 文件:
algo_stream_debug_pkt.debug_info max_count:10
问题是 algo_stream_debug_pkt
类型的编码协议缓冲区数据在我的用例中使用了大约 58 个字节(当流式传输到内存时)。 algo_stream_debug_pkt
的实际 c 结构仅使用 48 个字节 [sizeof(algo_stream_debug_pkt)
-> 48]。我想知道为什么协议缓冲区版本比非编码的 c 结构版本消耗更多 space,因为 nanopb 使用 varints 来表示整数类型,因此实际编码版本应该比最初指定的类型消耗更少的内存。
The issue is that the encoded protocol buffer data of type algo_stream_debug_pkt uses approximately 58 bytes (when streamed to memory) for my use case. The actual c structure of algo_stream_debug_pkt uses just 48 bytes [ sizeof(algo_stream_debug_pkt) -> 48 ]
每个protobuf字段都以字段标签号为前缀,至少占用一个字节。字段标签占用 15 个字节,header
子消息和 debug_info
数组长度占用 2 个字节。
另一方面,一些space通过将值编码为可变长度整数来保存,对于小于128的值只占用一个字节。
一般的protobuf格式比较space-efficient,但不是压缩格式。协议中forward-和backward-compatibility的要求也会造成一些开销
我正在尝试转换以下 C 结构:
typedef struct _algo_stream_debug_pkt {
uint16_t src;
uint16_t dest;
uint16_t length;
uint16_t crc;
uint8_t command;
uint8_t status;
uint16_t sequence_num;
uint32_t timestamp;
uint16_t data_state;
uint16_t algo_out_x1;
uint16_t algo_out_x2;
uint16_t algo_out_x2;
uint16_t algo_interval;
uint16_t debug_info[10];
} algo_stream_debug_pkt ;
使用以下 .proto 文件到协议缓冲区:
message m_header {
required int32 src = 1;
required int32 dst = 2;
required int32 len = 3;
required int32 crc = 4;
}
message algo_stream_debug_pkt {
required m_header header = 1;
required int32 command = 2;
required int32 status = 3;
required int32 sequence_num = 4;
required int32 timestamp = 5;
required int32 data_state = 6;
required int32 algo_out_x1 = 7;
required int32 algo_out_x2 = 8;
required int32 algo_out_x3 = 9;
required int32 algo_interval = 10;
repeated int32 debug_info = 11;
}
和以下 .option 文件:
algo_stream_debug_pkt.debug_info max_count:10
问题是 algo_stream_debug_pkt
类型的编码协议缓冲区数据在我的用例中使用了大约 58 个字节(当流式传输到内存时)。 algo_stream_debug_pkt
的实际 c 结构仅使用 48 个字节 [sizeof(algo_stream_debug_pkt)
-> 48]。我想知道为什么协议缓冲区版本比非编码的 c 结构版本消耗更多 space,因为 nanopb 使用 varints 来表示整数类型,因此实际编码版本应该比最初指定的类型消耗更少的内存。
The issue is that the encoded protocol buffer data of type algo_stream_debug_pkt uses approximately 58 bytes (when streamed to memory) for my use case. The actual c structure of algo_stream_debug_pkt uses just 48 bytes [ sizeof(algo_stream_debug_pkt) -> 48 ]
每个protobuf字段都以字段标签号为前缀,至少占用一个字节。字段标签占用 15 个字节,header
子消息和 debug_info
数组长度占用 2 个字节。
另一方面,一些space通过将值编码为可变长度整数来保存,对于小于128的值只占用一个字节。
一般的protobuf格式比较space-efficient,但不是压缩格式。协议中forward-和backward-compatibility的要求也会造成一些开销