'System.OutOfMemoryException' wurde ausgelöst, wenn noch genügend Speicher verfügbar ist

Das ist mein Code:

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

Ausnahme: Ausnahme vom Typ 'System.OutOfMemoryException' wurde ausgelöst.

Ich habe 4 GB Speicher auf dieser Maschine 2,5 GB ist frei Wenn ich damit beginne, ist auf dem PC genügend Speicherplatz vorhanden, um die 762 MB mit 100000000 Zufallszahlen zu verarbeiten. Bei verfügbarem Speicher muss ich so viele Zufallszahlen wie möglich speichern. Wenn ich in die Produktion gehe, werden 12 GB auf der Box sein, und ich möchte davon Gebrauch machen.

Beschränkt mich die CLR zunächst auf einen maximalen Standardspeicher? und wie fordere ich mehr an?

Aktualisieren

Ich dachte, dies in kleinere Teile aufzuteilen und meinen Speicherbedarf schrittweise zu erhöhen, würde helfen, wenn das Problem auf Folgendes zurückzuführen istSpeicherfragmentierungaber das tut es nichtIch kann eine ArrayList-Gesamtgröße von 256 MB nicht überschreiten, unabhängig davon, wie ich blockSize optimiere.

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

Von meiner Hauptmethode:

int blockSize = 1000000;

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

Antworten auf die Frage(14)

Ihre Antwort auf die Frage