一尘不染

当仍有大量可用内存时,抛出“ System.OutOfMemoryException”

c#

这是我的代码:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

异常:引发了类型为’System.OutOfMemoryException’的异常。

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

CLR是否将我限制为默认的最大内存开始? 以及我如何要求更多?

更新资料

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

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()));                
  }
}

从我的主要方法:

int blockSize = 1000000;

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

阅读 530

收藏
2020-05-19

共1个答案

一尘不染

您可能需要阅读以下内容:Eric Lippert的“ “内存不足”不涉及物理内存
”。

简而言之,并且非常简化,“内存不足”并不真正意味着可用内存量太小。最常见的原因是,在当前地址空间内,没有连续的内存部分足够大以服务于所需的分配。如果您有100个块,每个块4
MB,那么当您需要一个5 MB块时,这将无济于事。

关键点:

  • 在我看来,我们称之为“进程存储器”的数据存储最好可视化为 磁盘上海量文件
  • RAM可以看作仅仅是性能优化
  • 程序消耗的虚拟内存总量实际上与它的性能没有太大关系
  • 很少“用完RAM”会导致“内存不足”错误。它导致错误的性能,而不是错误,因为存储实际上在磁盘上这一事实的全部成本突然变得很重要。
2020-05-19