我们有一个在几个字典中拥有大量对象的应用程序,其中一些在应用程序的生命周期中持续增长(具有很多工具的交易应用程序和不断增长的订单/交易).
由于大对象堆的碎片,我们遇到OutOfMemoryExceptions问题.
为了应对这一点,我试图写一个“大”字典,被实现为一个两级字典,其中所有的叶子字典都不够大,不能分配给LOH.我使用一致的散列算法,以避免在单个存储桶变得过大时重新整理字典.一致的散列“圆”是C5集合库中的TreeDictionary.
我的问题是,有没有更好的数据结构(或者可能更好地实现我所描述的)C#?
更新
这是“大”字典的实现:https://gist.github.com/956621
我知道这不是万无一失的,因为LOH堆阈值都不在规范中,也不是每个Dictionary条目或缩放算法的大小.不过,这是目前最好的我可以想到的,以避免应用程序在今天中午爆炸.
解决方法
当您的应用程序中最大的一个字典是一个不幸的数据结构.哈希表的大小往往是倍增的,当它变得太满时,在关键时刻,在调整大小期间需要150%的过度分配.哈希表在巨大的情况下工作得很好,但它需要连续分配来强调堆算法.
您可以使用多级哈希表来减少这些缺点,例如使用一个字节的哈希码作为256个哈希表的索引.这增加了一些开销,但更重要的是,这个和其他策略充满了危险,随着随机性,如你获得的哈希码,并可能使事情变得更糟,性能更差.使用这种方法需要良好的理论基础和坚实的实证检验.但它可以工作.
另一个策略是预先分配最坏的情况下最大的数据结构,并尽早分配.没有细粒度的分配是必要的,但现在如果它应该用完,你将面临灾难性的失败的幽灵.这是一个选择.