【发布时间】:2012-02-06 13:16:15
【问题描述】:
我对打包字段和存储/序列化有一些疑问 带有协议缓冲区的数据。 我本质上想要做的是将 4MB 的数据存储到一个文件中。
我拥有的数据(在我们的嵌入式系统中)以 uint8_t(一个字节)的形式接收,我希望尽可能高效地存储这些数据。
我一直在测试各种 protobuf 设置(四个);
repeated uint32_t datastruct = 1;
repeated uint32_t datastruct = 1 [packed = true]
将两个变体分配为 1 比 1(将 uint8 放入 uint32),并且两个变体都以 4 个值移位到 uint32_t。
令我惊讶的是,存储的文件比原始文件大得多 数据。 (当然,我将 uint8 放入 uint32 的示例是预期的..) 我能达到的最好结果是 5.2MB 的 4MB 数据, 真的不是很好。
我在这里误解了一些重要的事情吗? 我确实意识到 protobuf 将信息添加到数据包中,但是 25% 增加太多恕我直言。
同时使用 GzipOutputStream 会增加而不是减小文件的大小。
任何提示将不胜感激!
感谢您的宝贵时间。
【问题讨论】:
-
这里的
uint32_t是什么?那是 .proto 中的message吗? -
是的,就是这样。
-
那么......我很困惑......我认为“打包”甚至工作这样......?还是一个团体?
-
引用文档:
Only repeated fields of primitive numeric types (types which use the varint, 32-bit, or 64-bit wire types) can be declared "packed".- 据我所知,如果uint32_t是message,则使用“packed”是无效 -
我意识到我在这里有点不清楚,在 protofile 中定义了以下内容:repeated uint32 datafield = 1 [packed = true];我与此消息一起使用的数据类型是 uint32_t 类型(当然还有 32 位)。
标签: c++ serialization protocol-buffers