如何最小化Protobuf.NET内存消耗

时间:2011-10-25 16:07:07

标签: c# .net protobuf-net

我正在使用Protobuf.NET序列化大量的类,其中大部分是作为引用(因为我有多个引用到我的数据结构中的相同类)。

所有序列化类都使用ImplicitFirends.AllFields进行序列化以确保 一切都被抛弃了。

在我目前的测试用例中,我有53个文件,总金额为500MB。

当我使用Protobuf.NET反序列化器读取此数据时,我的专用字节/驻留内存最多可以射出9GB并且在那里保持不变(即,这不是在反序列化后释放的临时内存/ GC'd。)

另一个特殊的事情是,如果我重写(重新序列化)所有数据,它仍然保持相同的大小。

这个x20在内存中爆炸是否有意义?

1 个答案:

答案 0 :(得分:5)

我会运行一些测试,但它听起来就像是它保留的缓冲池以避免分配。除了测试之外,我还会在下一个版本中添加“dump the pool”方法(并禁用?)。事实上,考虑一下:我会将这些更改为WeakReference,因此它们可以在存在时重复使用,但仍然可以收集。

您可能还会发现(作为合同中的选项)对子对象和列表使用“group”编码可以大大减少; length-prefixed是默认值(和Google的首选选项),但是组的写入效率更高,因为它们可以直接编写而无需任何缓冲。如果你想要一个例子,请告诉我。 Protobuf-net的设计使得它们之间的切换不是一个突破性的变化,但其他 protobuf客户端将不会那么宽容,如果你使用protobuf与其他系统进行互操作,那就太棘手了。