„System.OutOfMemoryException” został rzucony, gdy wciąż jest dużo wolnego miejsca

To jest mój kod:

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

Wyjątek: Wyrzucono wyjątek typu „System.OutOfMemoryException”.

Mam 4 GB pamięci na tym urządzeniu 2.5 GB jest bezpłatne kiedy zacznę to uruchamiać, jest wystarczająco dużo miejsca na komputerze, aby obsłużyć 762 MB 100000000 liczb losowych. Muszę zapisać jak najwięcej losowych liczb, biorąc pod uwagę dostępną pamięć. Kiedy pójdę do produkcji, na pudełku będzie 12 GB i chcę z niego skorzystać.

Czy CLR ogranicza mnie do domyślnej maksymalnej pamięci na początek? i jak mogę poprosić o więcej?

Aktualizacja

Pomyślałem, że przełamanie tego na mniejsze kawałki i stopniowe dodawanie do moich wymagań pamięciowych pomogłoby, gdyby problem był spowodowanyfragmentacja pamięci, ale tak nie jestNie mogę przekroczyć całkowitego rozmiaru ArrayList 256 MB, niezależnie od tego, co robię, zmieniając rozmiar bloku.

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

Z mojej głównej metody:

int blockSize = 1000000;

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

questionAnswers(14)

yourAnswerToTheQuestion