【发布时间】:2011-05-05 04:26:27
【问题描述】:
我们有一个应用程序,它在几个 Dictionarys 中保存大量对象,其中一些对象在应用程序的生命周期内不断增长(交易应用程序具有大量工具和不断增长的订单/交易)。
由于大型对象堆的碎片,我们遇到了OutOfMemoryExceptions 的问题。
为了解决这个问题,我尝试编写一个“大”字典,该字典被实现为两级字典,其中所有叶字典都不够大,无法在 LOH 上分配。我使用了一致的散列算法来避免当单个存储桶变得太大时必须重新散列整个字典。一致的散列“圆圈”是来自 C5 集合库的 TreeDictionary。
我的问题是,C# 是否有更好的数据结构(或者可能是我所描述的更好的实现)?
更新
这是“大”字典的实现:https://gist.github.com/956621
我知道这不是万无一失的,因为规范中既没有 LOH 堆阈值,也没有每个 Dictionary 条目的大小或缩放算法。但是,这是目前我能想到的最好的方法,以避免应用程序在中午崩溃。
【问题讨论】:
-
这可能有助于说明您在现有实施中看到了什么问题?
-
如果您将字典用作平面对象的键值存储,您可能会考虑使用内存映射文件。
-
您是否验证过您没有在任何地方“泄漏”内存(如在所持有的引用中“泄漏”内存)
-
@Mitch Wheat,我们花了很多时间研究内存分析器(特别是 redgate ANTS 内存分析器)。我们已将所有潜在的泄漏减少到实际使用的内存相对恒定的程度。分析器指出 LOH 特别分散。目前,运行 3 小时后,LOH 使用了 10.37MB,但分配了 435.4MB,最大空闲片段为 49.83MB。在使用“大”字典实现之前,情况要糟糕得多。
-
为什么不使用本地数据库,如 squlite 或 SQL 精简版?您将能够轻松地索引和查询您的需求,并且数据库已经根据情况管理缓存。这就是创建数据库的全部原因,如果您的应用程序崩溃,那么您会丢失所有内容,但数据库将维护所有内容。甚至像 Auto Cad 这样的应用程序也使用数据库来存储其复杂的 3D 结构。
标签: c# large-object-heap