【发布时间】:2013-08-27 16:07:22
【问题描述】:
我正在使用 ProtoBuf,试图了解预期的压缩类型。作为一个测试用例,我有一个包含 10,000,000 个十个字符串的列表,我正在对其进行序列化,然后将其拆分为 3.9mb 的块。 ProtoBuf 似乎在这方面做得很糟糕,最终创建了 30 多个块。这是我运行的测试的结果。
ProtoBuf-Net 序列化:30 个 3.9mb 块
BinaryFormatter 序列化:12 个 3.9mb 块
带有 Deflate 流序列化的 BinaryFormatter:1 72kb 块
我这样调用 ProtoBuf:
ProtoBuf.Serializer.Serialize<List<string>>(names);
感谢任何帮助。
【问题讨论】:
-
1000 万个 10 字符字符串占用 10E6*(4+10*2) = 229 MB = 59 个块。使用 8 位编码将其减少 2 倍非常简单。那个杯子是半满的。
-
@Hans protobuf 使用 UTF-8,所以我可以推断字符串基本上是 ASCII 范围 - 30 个块对于原始数据加上开销来说是正确的。当然可以优化(在我的回答中讨论)
-
elicid,下次用你的计算器,我们就不用了。 30*3.9MB/10000000=12 字节每 10 个字符的字符串。这个尺寸对我来说听起来很合理。
标签: c# .net serialization compression protobuf-net