System.OutOfMemoryException была выброшена, когда все еще много свободной памяти

Это мой код:

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

Исключение: Исключение типа «System.OutOfMemoryException» был брошен.

I have 4GB memory on this machine 2.5GB is free когда я запускаю этот прогон, на компьютере явно достаточно места для обработки 762 Мб из 100000000 случайных чисел. Мне нужно хранить как можно больше случайных чисел с учетом доступной памяти. Когда я пойду в производство, на коробке будет 12 ГБ, и я хочу использовать его.

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;

Ответы на вопрос(14)

Ваш ответ на вопрос