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

dam*_*boy 4 .net c# protobuf-net

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

所有序列化类都使用ImplicitFirends.AllFields序列化,以确保所有内容都被转储.

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

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

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

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

Mar*_*ell 5

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

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