C# 哈希表-内存不足

C# 哈希表-内存不足,c#,memory,hashtable,C#,Memory,Hashtable,我在c#应用程序中使用哈希表。我正在向中加载数百万个密钥,但在应用程序超过3,7GB的RAM后,会出现“内存不足”异常 我使用x64操作系统,计算机有16GB的ram。我在想这可能是x86的限制。我将构建类型更改为x64,但仍然收到错误 net中的对象是否有最大内存大小?我能做点什么来利用所有的记忆吗 谢谢, 安德鲁看看前面的答案: 2GB限制分别适用于每个对象。用于所有对象的总内存可能超过2GB 这说明.NET将单个对象的大小限制为2GB。使用字典而不是哈希表。在哈希表中键和值都是对象,因此如

我在c#应用程序中使用哈希表。我正在向中加载数百万个密钥,但在应用程序超过3,7GB的RAM后,会出现“内存不足”异常

我使用x64操作系统,计算机有16GB的ram。我在想这可能是x86的限制。我将构建类型更改为x64,但仍然收到错误

net中的对象是否有最大内存大小?我能做点什么来利用所有的记忆吗

谢谢,
安德鲁

看看前面的答案:

2GB限制分别适用于每个对象。用于所有对象的总内存可能超过2GB

这说明.NET将单个对象的大小限制为2GB。

使用
字典
而不是
哈希表
。在
哈希表中
键和值都是对象,因此如果它们是值类型,它们将被装箱。
字典
可以将值类型作为键和/或值,这会占用较少的内存。例如,如果使用
int
作为键,则每个键在
哈希表中使用28个字节,而在
字典中仅使用4个字节


如果键和值都是值类型,并且使用少于8个字节,
字典
将能够容纳比
哈希表
更多的项

我发现这个页面非常有用,因为我在VB.net中遇到了完全相同的问题。我创建了一些非常大的哈希表,我的应用程序在尝试创建它们时抛出内存不足异常

我尝试了“Guffa”的想法,在一个较小的示例哈希表上使用字典,结果得到的字典实际上变大了

他的建议让我思考我到底在写什么。所以我看了一下,决定不需要存储Long类型的数据,一个整数就足够了。我知道我可能是在告诉所有的权威们什么是显而易见的,但是我能够通过简单地将变量声明为整数而不是long,将得到的序列化hastable(总共12个)从81.9Mb减少到69.4Mb


这实际上并没有解决我的问题,但肯定会缩短将它们加载回内存所需的时间。

问题与系统中的物理RAM量无关,也与是否编译了x64无关。现在,.NET必须将对象限制在2GB也不是真的。(您可能需要调查.NET 4.5的大型对象堆以了解更多有关信息。)出现“内存不足”的原因是进程无法映射所请求大小的连续内存部分

埃里克·利珀特在这个问题上有着出色的表现,我注意到他对这个问题发表了评论,但不幸的是他没有回答

因此,答案是:接受这样一个事实,即您在这个实现中寻求的内存大小并不容易获得,并通过将其分解为更小的内存块来解决您的问题。


我有同样的问题,必须采取同样的方法。使用锯齿阵列可能会有所帮助,或者将数据分解为多个逻辑组件并创建一系列较小的哈希表。

对于这种大小的数据集,您可能需要使用一些基于磁盘(或部分基于磁盘)的解决方案。将那么多数据加载到内存中不是好的业力。看看BerkeleyDB,它有.NET绑定,而且是免费的。RAM是不相关的;RAM只是一个高速缓存,可以加快内存访问速度。相关的稀缺资源是可用的地址空间。埃里克·利珀特:我不知道你是否对这个问题或我的评论发表了评论,但我的意思是(除了有限的地址空间外),从磁盘加载这么多数据(特别是从/如果它被调出)需要花费大量时间。对;我想说的是,一个以“我的内存快用完了,但我有足够的内存”开头的问题表明了对实际内存不足的误解。您可以有256兆的RAM,但仍然有20个程序,每个程序使用500兆的地址空间;机器速度会很慢,但不会耗尽地址空间。您可以有14 GB的空RAM,但地址空间仍然不足。RAM的数量与地址空间耗尽的问题完全无关;它只与性能有关。+1,在我还在打字的时候打败了我。另请参见:@Sapph,ty对于该链接,我正在寻找它以补充此答案=)