DataTable gibt keinen Speicher frei

8

Ich habe einen Datenladeprozess, der eine große Menge an Daten in DataTable lädt und dann einige Daten verarbeitet, aber jedes Mal, wenn der Job beendet ist, gibt die DataLoader.exe (32bit, hat ein 1,5G Speicherlimit) nicht alle frei Speicher wird verwendet.

Ich habe versucht, 3 Möglichkeiten zur Freigabe von Speicher:

  1. DataTable.Clear () rufen Sie dann DataTable.Dispose () auf (freigeben Sie ca. 800 MB Speicher, aber erhöhen Sie immer noch 200 MB Speicher jedes Mal, wenn Datenladevorgang beendet wird, nach 3 oder 4 Mal Daten laden, out of memory Ausnahme ausgelöst, weil es überschreitet 1,5 G Speicher insgesamt)
  2. Setzen Sie DataTable auf null (kein Speicher freigegeben und wenn laden mehr Daten, out of memory Ausnahme ausgelöst)
  3. Aufruf von DataTable.Dispose () direkt (kein Speicher freigegeben, und wenn laden mehr Daten, out of memory Ausnahme ausgelöst)

Nachstehend ist der Code, den ich zum Testen ausprobiert habe (im realen Programm wird er nicht rekursiv aufgerufen, er wird von einer Logik zur Verzeichnisüberwachung ausgelöst. Dieser Code dient nur zum Testen. Sorry für die Verwirrung.):

%Vor%     
mhan0125 04.06.2015, 14:57
quelle

4 Antworten

1

Irgendwann fand ich, dass diese Datentabelle kein Release-Speicherfehler durch Oracle-Massenkopie verursacht wurde. Für den Fall, dass jemand das gleiche Problem hat. Bitte beachten Sie folgenden Beitrag als Referenz

OracleBulkCopy-Speicherverlust (OutOfMemory-Ausnahme)

    
mhan0125 19.08.2015, 20:26
quelle
3

Wenn Sie den Teil verschieben, wenn Sie ihn außerhalb der Funktion wiederholen möchten, wird der Speicher korrekt freigegeben (nur Testmethode 1 (Löschen und Entsorgen)):

%Vor%

Wahrscheinlich wird der Speicher der Objekte freigegeben, wenn sie den Gültigkeitsbereich verlassen haben

    
Matteo Umili 04.06.2015 15:22
quelle
2

Ihr Hauptproblem ist das Verhalten des Garbage Collectors, je nachdem, ob Sie debuggen oder im Release-Modus sind, ohne dass ein Debugger vorhanden ist.

Wenn ein Debug-Build oder ein Release-Build mit einem Debugger vorhanden ist, wird die Lebensdauer aller Objekte auf die gesamte Lebensdauer der Methode erweitert. Was das bedeutet, ist table kann nicht vom GC zurückgefordert werden, bis Sie die Methode LoadData abgeschlossen haben. Dies ist der Grund dafür, dass Ihnen immer weniger Speicher zur Verfügung steht.

Wenn Sie Ihr Programm in den Freigabemodus ändern und es ohne den Debugger ausführen, wird das Objekt, sobald Sie den letzten Verweis auf das Objekt, auf das die Variable table verweist, in Ihrem Codepfad für Garbage Collection und Sie verfügbar machen den Speicher freimachen.

Der Grund, warum der GC sein Verhalten während einer "debuggable situation" ändert, ist der Debugger selbst, der einen Verweis auf alle Variablen enthält, die sich im Bereich des gerade ausgeführten Codes befinden. Andernfalls könnten Sie den Wert einer Variablen im Überwachungsfenster nicht ansehen oder darüber mogeln. Aus diesem Grund können Sie nicht "die letzte Referenz auf das Objekt übergeben", bis die Variable den Gültigkeitsbereich verlässt oder Sie die Variable überschreiben.

Lesen Sie den Blog-Beitrag über Garbage Collection, Scope und Object Lifetimes für detailliertere Informationen über den Prozess.

    
Scott Chamberlain 04.06.2015 18:31
quelle
1

Es gibt nicht wirklich eine Möglichkeit, C # zu zwingen, Speicher freizugeben, wie dies bei Code ohne Speicherverwaltung der Fall wäre. Es hilft zu verstehen, wie der .NET-Garbage Collector funktioniert. Die Speicherauslastung in .NET-Anwendungen steigt im Grunde auf eine von drei Bedingungen, die eine Speicherbereinigung auslösen. Ich beschreibe den Prozess in der Antwort auf die folgende Frage:

Variablen in Methoden bereinigen

Eine Möglichkeit, die Ausnahme OutOfMemory zu vermeiden, ist die Verwendung der Klasse MemoryFailPoint , mit der Sie einen Fehlerpunkt festlegen können, ab dem ein InsufficientMemoryException ausgelöst wird, wodurch Sie den Prozess bis zu einem anderen Worker verlangsamen können Thread ist verfügbar. Ich bin mir nicht sicher, ob dies etwas ist, was Sie ausprobieren möchten, aber es steht Ihnen zur Verfügung:

Ссылка

    
maniak1982 04.06.2015 15:12
quelle