1

我正在玩 ProtoBuf,试图了解期望什么样的压缩。作为一个测试用例,我有一个包含 10,000,000 个十个字符串的列表,我正在对其进行序列化,然后将其拆分为 3.9mb 的块。ProtoBuf 似乎在这方面做得很糟糕,最终创建了 30 多个块。这是我运行的测试的结果。


ProtoBuf-Net 序列化:30 个 3.9mb 块

BinaryFormatter 序列化:12 个 3.9mb 块

BinaryFormatter w/Deflate 流序列化:1 72kb 块


我这样称呼 ProtoBuf:

ProtoBuf.Serializer.Serialize<List<string>>(names);

任何帮助表示赞赏。

4

1 回答 1

8

你能指出这里的测试数据是什么吗?我怀疑您正在多次序列化相同的字符串实例。BinaryFormatter 总是重用引用。核心 protobuf 规范没有对象重用,因此 protobuf-net(为了兼容性)尊重这一点 - 但它确实支持对象重用(使用特殊情况下的字符串以提高性能)。但它是严格选择加入的,以保持与其他 protobuf 实现的兼容性。

所以:如果数据真的要使用相同的字符串内容:我可以向您展示如何启用它。

如果数据不会真正使用相同的字符串内容:那么您的测试无效。

于 2013-08-24T20:09:02.667 回答