C# OutOfMemoryException—克服此问题的策略?

C# OutOfMemoryException—克服此问题的策略?,c#,.net,exception-handling,out-of-memory,C#,.net,Exception Handling,Out Of Memory,首先,我知道这个问题在这个论坛上已经讨论过很多次,例如 和 我遇到问题的对象是 Dictionary<long, Double> results 字典结果 它将ID存储为long,计算结果存储为Double 我必须重复使用同一个对象大约10~20次,每次重复使用时,我都会调用 results = new Dictionary<long, Double> results=新字典 我知道我可以将其写入文本文件或数据库文件进行进一步处理,但如果可能的话,我会尽量避免这

首先,我知道这个问题在这个论坛上已经讨论过很多次,例如 和

我遇到问题的对象是

Dictionary<long, Double> results
字典结果
它将ID存储为long,计算结果存储为Double

我必须重复使用同一个对象大约10~20次,每次重复使用时,我都会调用

results = new Dictionary<long, Double>
results=新字典
我知道我可以将其写入文本文件或数据库文件进行进一步处理,但如果可能的话,我会尽量避免这种情况,因为它对于我处理的数据量来说太慢了。我也尝试过GC.Collect(),但没有成功

有经验的人能在这方面给点建议吗


编辑:我在列表中有超过300万个对象,但它们是固定的(即,在所有迭代中键都是相同的)

Ah-否。在调用中获取内存不足异常也没有什么意义

我强烈建议你认真分析——在程序中加入内存分析器,找出真正的问题。一个长/双组合是没有意义的,除非你存储了大约一亿对,即使如此

而且:移动到64位总是明智的。由于GC“开销”—不可能耗尽所有内存,每个进程2/3 gb的限制在.net上更难实现。64位具有更高的限制


但同样,你的指示是错误的。新字典可能根本不是错误,其他东西会浪费你的内存。

如果问题仅仅是内存没有按预期释放;如果您在字典上使用“.Clear()”,而不是每次都重新创建,则可能需要使用一个实例,而不是创建20个不同的实例,但要清除列表(允许GC收集旧元素),以便有更多的内存来使用。此外,如果您需要大量内存,迁移到64位环境可能是明智的。

您能清除它而不是每次都创建一个新的吗?内存分配可能会很昂贵。您真的必须使用长的ID吗?你的字典里有多少项?@Chibacity:300万项Ihave@cherhan那么你就不需要长ID了。请改用int-id,因为它的范围将高达20亿字节,并且每项仅使用4字节而不是8字节。如果您有足够的物理内存,则值得考虑将其移动到64位,否则您可能会在分页文件中切换。如果在大型数据结构上进行迭代,并且没有足够的物理内存,这可能会非常痛苦。仅供参考,我正在Windows 7 64位上使用VS.NET 2010(仍然在调试器中运行32位;)还有-@chibacity-今天每一台愚蠢的小计算机都能很好地处理64位。每个进程的限制是2gb(不带修补程序),3个32位。几乎没有一台计算机没有更多的内存。@TomTom你误解我了。虽然64位为您提供了非常大的虚拟地址空间,但如果您不想将大部分时间花在分页文件中,这仍然需要物理内存进行备份。@TomTom我知道您所说的一切,还有更多。你们对我说的方式是专横的,傲慢的,带着一点欺凌。我相信你真的是一个很可爱的人。这不是一个答案——考虑到涉及的数量,这是没有意义的。除非OP完全偏离他的描述,否则这永远不会是问题。