这是我的代码:

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

Exception: Exception of type ‘System.OutOfMemoryException’ was thrown.

I have 4GB memory on this machine 2.5GB is free当我开始运行时,电脑上显然有足够的空间来处理 762MB 的 100000000 个随机数。

Does the CLR constrain me to a default max memory to start with? and how do I request more?

Update

我认为如果问题是由于以下原因造成的,将其分成更小的块并逐渐增加我的内存需求会有所帮助memory fragmentation ,但事实并非如此I can’t get past a total ArrayList size of 256mb regardless of what I do tweaking blockSize

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;

答案

您可能想阅读以下内容:"“内存不足"并不是指物理内存“埃里克·利珀特。

简而言之,非常简单,“内存不足"并不真正意味着可用内存量太小。

Key Points:

  • 在我看来,我们称之为"进程内存"的数据存储最好可视化为massive file on disk
  • RAM 可以看作仅仅是性能优化
  • 程序消耗的虚拟内存总量与其性能实际上并没有太大关系
  • “RAM 不足"很少会导致"内存不足"错误。

来自: stackoverflow.com