大对象堆友好IDictionary

Sim*_*onC 10 c# large-object-heap

我们有一个应用程序可以在几个Dictionarys 中保存大量对象,其中一些在应用程序的生命周期中不断增长(交易应用程序包含大量工具和不断增长的订单/交易).

OutOfMemoryException由于大对象堆的碎片,我们遇到了问题.

为了解决这个问题,我试图写一个"大"字典,它实现为一个两级字典,其中所有的叶子字典都不够大,不能在LOH上分配.我使用了一致的哈希算法,以避免在单个存储桶变得太大时重新整理整个字典.一致的哈希'circle' TreeDictionary来自C5集合库.

我的问题是,C#有没有更好的数据结构(或者我描述的更好的实现)?

更新

这是"大型"字典的实现:https://gist.github.com/956621

我知道它不是万无一失的,因为LOH堆阈值既不在规范中,也不是每个Dictionary条目或缩放算法的大小.然而,这是目前我能想到的最好的,以避免应用程序在中午爆炸.

Eup*_*ric 1

我认为这需要改变算法。

据我了解和了解,GC在内存打包和碎片整理方面相当擅长。所以你的问题源于一个简单的事实,即你在内存中保存了太多的数据。

您在内存中保存了多少数据?

您考虑过使用数据库吗?紧凑的一个可能就足够了。

或者简单地告诉您的客户,要正确运行您的应用程序,他需要 16 GB 内存。如果您的应用程序需要全部 16 GB 内存,那么肯定有问题。

编辑:从不同的角度看你的问题,在阅读你的编辑后,我得到了问题:你的物体有多大?或者它们包含长列表或数组?您多久删除/添加这些对象一次?

我认为问题可能不在于字典本身,而在于太大并且被删除/添加过于频繁的对象。也许使用某种捕捉或池可能会有利可图。如果您使用列表,则使用预先分配的方式创建这些列表。

也许使用不可变结构而不是可变类可以减轻碎片。