3 Stimmen

OutOfMemoryException nur im Release-Modus beim Kompilieren mit VS2010?

Mein Programm erzeugt OutOfMemoryExcetion nur im Release-Modus, Kompilieren mit VS2010 C# Compiler. Die Operation, die es durchgeführt wurde, wenn der Absturz aufgetreten ist, war Instanziierung 1600 gezackte Arrays, und es brach, wenn bei der 207. der vereinfachten Version der Schleife unten:

Double[][] arr = new Double[1600][];
int i = 0;
while (i < 1600)
{
    arr[i] = new Double[1000000];
    i++;
}

Im Grunde genommen würde allein dieser Teil des Codes ~ 11,9 GB erzeugen, wenn man bedenkt, dass ein Double 8 Byte verbraucht. Ich habe nicht diese Menge an RAM, aber in eine andere Frage, in der ich fragte, was passiert, wenn der Arbeitsspeicher zu Ende ist Sie antworteten mir, dass die CLR einen Auslagerungsspeicher erstellt, obwohl sie nur eine genau definierte Menge an Speicher adressieren kann.

Wenn ich mein Programm im DEBUG-Modus kompiliere, löst es nicht die OutOfMemoryException stattdessen wird eine Menge Speicher zugewiesen und das Programm läuft weiter... Ich hatte nicht genug Geduld, um zu prüfen, ob das Programm reibungslos, wenn auch langsam, bis zum Ende laufen würde, weil es zu lange dauerte.

Also:

  • Was ist im Freigabemodus passiert, was im Debugmodus nicht der Fall war, so dass das Programm dort eine Exception ausgelöst hat?
  • In Anbetracht der Tatsache, dass ich diese Menge an Speicher wirklich speichern muss, weil es sich um Daten handelt, die durch einige wissenschaftliche Berechnungen erzeugt wurden, was sind Ihre Ratschläge, um dieses Problem zu lösen? (Ich erwäge, die generierten Daten während der Berechnungen zu verarbeiten, obwohl dies etwas mehr Zeit während der Berechnungen selbst in Anspruch nehmen würde, anstatt eine Menge Daten zu generieren und sie dann zu verarbeiten...)

9voto

Joe White Punkte 90737

Angenommen, Sie haben Ihr Projekt in Visual Studio 2010 erstellt, wäre das Plattformziel standardmäßig x86, d. h. ein 32-Bit-Programm. Ich gehe davon aus, dass Sie dies bereits in x64 geändert haben, sonst hätten Sie nie mehr als 2 GB Adressraum zuweisen können.

Ich vermute, dass Sie gerade auf Projekteigenschaften > Registerkarte "Erstellen" gegangen sind und "Plattformziel" geändert haben. Die Sache ist, wenn das ist alles, was Sie getan haben, das würde nur Ihre Debug-Build-Konfiguration beeinflussen, weil der "Konfiguration" Filter am oberen Rand des Bildschirms standardmäßig auf "Active (Debug)".

Ändern Sie das Filterfeld auf "Release", um Ihre Release-Build-Einstellungen zu sehen. Hier müssen Sie auch "Platform target" auf "x64" ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X