加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 大对象堆友好IDictionary

发布时间:2020-12-15 03:54:42 所属栏目:百科 来源:网络整理
导读:我们有一个在几个字典中拥有大量对象的应用程序,其中一些在应用程序的生命周期中持续增长(具有很多工具的交易应用程序和不断增长的订单/交易). 由于大对象堆的碎片,我们遇到OutOfMemoryExceptions问题. 为了应对这一点,我试图写一个“大”字典,被实现为一个
我们有一个在几个字典中拥有大量对象的应用程序,其中一些在应用程序的生命周期中持续增长(具有很多工具的交易应用程序和不断增长的订单/交易).

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

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

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

更新

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

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

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读