gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:09:02 24 4
gpt4 key购买 nike

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

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

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

当我使用 Protobuf.NET 反序列化器读取此数据时,我的私有(private)字节/常驻内存猛增至 9GB 并保持在那里(即这不是临时内存释放/反序列化后的 GC)。

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

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

最佳答案

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

您可能还会发现(作为契约(Contract)的一个选项)对子对象和列表使用“组”编码在这里会大大减少; length-prefixed 是默认值(也是 Google 的首选选项),但是组的写入效率更高,因为它们可以直接写入而无需任何缓冲。让我知道您是否想要这样的示例。 Protobuf-net 的设计使得它们之间的切换不是重大更改,但其他 protobuf 客户端不会那么宽容,所以如果您使用 protobuf 与其他系统进行互操作,那就更棘手了。

关于c# - 如何最小化 Protobuf.NET 内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com