c# – 大对象堆友好IDictionary

我们有一个在几个字典中拥有大量对象的应用程序,其中一些在应用程序的生命周期中持续增长(具有很多工具的交易应用程序和不断增长的订单/交易).

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

为了应对这一点,我试图写一个“大”字典,被实现为一个两级字典,其中所有的叶子字典都不够大,不能分配给LOH.我使用一致的散列算法,以避免在单个存储桶变得过大时重新整理字典.一致的散列“圆”是C5集合库中的TreeDictionary.

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

更新

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

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

解决方法

当您的应用程序中最大的一个字典是一个不幸的数据结构.哈希表的大小往往是倍增的,当它变得太满时,在关键时刻,在调整大小期间需要150%的过度分配.哈希表在巨大的情况下工作得很好,但它需要连续分配来强调堆算法.

您可以使用多级哈希表来减少这些缺点,例如使用一个字节的哈希码作为256个哈希表的索引.这增加了一些开销,但更重要的是,这个和其他策略充满了危险,随着随机性,如你获得的哈希码,并可能使事情变得更糟,性能更差.使用这种方法需要良好的理论基础和坚实的实证检验.但它可以工作.

另一个策略是预先分配最坏的情况下最大的数据结构,并尽早分配.没有细粒度的分配是必要的,但现在如果它应该用完,你将面临灾难性的失败的幽灵.这是一个选择.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...