首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“System.OutOfMemoryException”在仍有大量内存可用时引发

“System.OutOfMemoryException”在仍有大量内存可用时引发
EN

Stack Overflow用户
提问于 2009-07-20 13:50:54
回答 14查看 321.9K关注 0票数 102

这是我的代码:

代码语言:javascript
复制
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

异常:引发了'System.OutOfMemoryException‘类型的异常。

我在这台机器上有4 4GB的内存,2.5 4GB是空闲的,当我开始运行这个程序时,PC上显然有足够的空间来处理762mb的100000000个随机数。我需要在给定可用内存的情况下存储尽可能多的随机数。当我投入生产时,盒子上将有12 go,我想要利用它。

CLR是否将我限制在默认的最大内存开始?我如何请求更多信息?

更新

我认为如果问题是由于内存碎片造成的,那么将其分成更小的块并逐步增加内存需求会有所帮助,但它不会我无法超过256mb的总ArrayList大小,无论我如何调整blockSize。

代码语言:javascript
复制
private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i++) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}

在我的main方法中:

代码语言:javascript
复制
int blockSize = 1000000;

while (true) {
  try
  {
    AddNDRandomNumbers(blockSize);                    
  }
  catch (System.OutOfMemoryException ex)
  {
    break;
  }
}            
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-07-20 13:58:40

你可能想读一下这本书: Eric Lippert的"“Out Of Memory” Does Not Refer to Physical Memory“。

简而言之,“内存不足”并不意味着可用内存量太小。最常见的原因是,在当前地址空间内,没有足够大的连续内存部分来满足所需的分配。如果您有100个块,每个块都有4MB大小,那么当您需要一个5MB的块时,这对您没有帮助。

要点:

我们称之为“进程内存”的数据存储在我看来是最好的可视化方式,在disk.

  • RAM上,一个巨大的文件可以看作仅仅是一个性能,而你的程序消耗的虚拟内存量与它的内存不足( performance

  • "running of optimization

  • Total )并没有太大的关系“很少会导致内存不足”错误。它不会导致错误,而是会导致性能下降,因为存储实际上在磁盘上的全部成本突然变得重要起来。
票数 149
EN

Stack Overflow用户

发布于 2013-06-26 21:56:07

检查您正在构建的是64位进程,而不是32位进程,后者是Visual Studio的默认编译模式。为此,右键单击您的项目,Properties -> Build -> platform目标: x64。与任何32位进程一样,以32位编译的Visual Studio应用程序的虚拟内存限制为2 2GB。

64位进程没有这个限制,因为它们使用64位指针,所以理论上它们的最大地址空间(虚拟内存的大小)是16EB (2^64)。实际上,Windows x64将进程的虚拟内存限制在8TB。内存限制问题的解决方案是以64位编译。

但是,默认情况下,.NET中object的大小仍然限制为2 2GB。您可以创建几个组合大小大于2 2GB的数组,但默认情况下不能创建大于2 2GB的数组。希望,如果您仍然希望创建大于2 2GB的数组,可以通过将以下代码添加到app.config文件中来实现:

代码语言:javascript
复制
<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>
票数 38
EN

Stack Overflow用户

发布于 2009-07-20 13:59:45

你没有一个连续的内存块来分配762MB,你的内存是零碎的,分配器找不到足够大的空洞来分配所需的内存。

  1. 您可以尝试使用/3GB (如其他人所建议的)
  2. 或切换到64位操作系统。
  3. 或修改算法以使其不需要大量内存。也许可以分配一些较小的(相对)内存块。
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1153702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档