【问题标题】:Hashtable - out of memory哈希表 - 内存不足
【发布时间】:2010-01-12 18:05:20
【问题描述】:

我在我的 c# 应用程序中使用 Hashtable。我正在加载数百万个密钥,但在应用程序超过 3.7GB 的 RAM 后,它会给我一个“内存不足”异常。

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

.net 中的对象是否有最大内存大小?我可以做些什么来使用所有的内存吗?

谢谢, 安德鲁

【问题讨论】:

  • 对于这种大小的数据集,您可能需要使用一些基于磁盘(或部分基于磁盘)的解决方案。将这么多数据加载到内存中并不是很好的业力。看看 BerkeleyDB,它有 .NET 绑定并且是免费的。
  • RAM 无关; RAM 只是一个缓存,可以加快内存访问速度。相关的稀缺资源是可用的地址空间
  • Eric Lippert:我不知道您是否评论了这个问题或我的评论,但我的意思是(除了有限的地址空间)从磁盘(特别是因为/如果它被分页)。
  • 对;我的意思是,一个以“我的内存不足但我有足够的 RAM”开头的问题表明了对实际用完的内容的误解。您可以拥有 256 兆的 RAM,但仍然有 20 个程序,每个程序使用 500 兆的地址空间;机器会很慢,但你不会用完地址空间。您可以拥有 14 GB 的空 RAM,但仍然会用完地址空间。 RAM 的大小与地址空间不足的问题完全无关;它只与性能有关。

标签: c# memory hashtable


【解决方案1】:

看看这个之前的回答:.NET Max Memory Use 2GB even for x64 Assemblies

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

【讨论】:

【解决方案2】:

使用Dictionary<,> 代替HashTable。在HashTable 中,键和值都是对象,因此如果它们是值类型,它们将被装箱。 Dictionary 可以将值类型作为键和/或值,使用较少的内存。例如,如果您使用 int 作为键,则每个将在 HashTable 中使用 28 个字节,而在 Dictionary 中仅使用 4 个字节。

如果键和值都是值类型并且使用少于 8 个字节,Dictionary 将能够比HashTable 容纳更多的项目。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      我尝试了“Guffa”的想法,即在较小的示例哈希表上使用字典,结果字典实际上增加了大小!

      他的建议让我开始思考我实际上是在向 Hashtable 写入什么。所以我查看了page 并决定我不需要存储 Long 类型的数据,Integer 就足够了。我知道我可能会告诉你们所有的大师什么是显而易见的,但我能够通过将变量声明为整数而不是 Longs 将生成的序列化 hastables(总共 12 个)从 81.9Mb 减少到 69.4Mb。

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

      【讨论】:

        【解决方案5】:

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

        Eric Lippert 在这个话题上有一个出色的blog article,我注意到他对这个问题发表了评论,但遗憾的是没有回答。

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

        我遇到了同样的问题,不得不采取同样的方法。使用锯齿状数组可能会有所帮助,或者将数据分解为多个逻辑组件并创建一系列较小的 HashTable。

        【讨论】:

          猜你喜欢
          • 2015-08-26
          • 2011-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-20
          • 1970-01-01
          相关资源
          最近更新 更多