如果内存可用,为什么会抛出内存异常?

Pau*_*aul 9 .net c# memory

我有一个相当简单的C#应用​​程序,它构建了一个大的哈希表.此哈希表的键是字符串,值是整数.

程序运行正常,直到大约1030万个项目被添加到哈希表中,当在将该项目添加到hasbtable的行上引发内存不足错误时.

根据任务经理的说法,我的程序只使用了797mb的内存,而且还有超过2GB的可用内存.它是一个32位的机器,所以我知道一个进程只能使用总共2gb,但是仍然会留下大约1.2gb的散列表应该可以扩展到.

为什么会抛出内存不足错误?

Dav*_*vy8 11

从理论上讲,你可以获得2GB的进程,但实际情况是它有2GB的连续内存,所以如果你的进程内存碎片化,你就会得到更少的内存.

另外,我怀疑默认情况下大多数数据结构的哈希表在需要增长时会增加一倍,从而在添加引爆点项时引起巨大的增长.

如果您知道它需要提前的大小(或具有合理的高估),则可能有助于在构造函数中指定容量.

或者,如果它在内存中并不重要,那么某种数据库解决方案可能会更好,并且如果它确实达到了它无法适应内存的程度,那么会给你更大的灵活性.