Ich habe ein Problem, wo ein paar 3-dimensionale Arrays, die eine große Menge an Speicher zuweisen und das Programm muss sie manchmal mit größer/kleiner ersetzen und wirft einen OutOfMemoryException.Force-Garbage-Collection von Arrays, C#
Beispiel: Es gibt 5 zugewiesene 96MB-Arrays (200x200x200, 12 Byte Daten in jedem Eintrag) und das Programm muss sie durch 210x210x210 (111MB) ersetzen. Es tut es auf ähnliche Weise wie folgt:
Wo Array1-Array5 sind die gleichen Felder zuvor verwendet. Dies sollte die alten Arrays als Kandidaten für die Garbage Collection setzen, aber anscheinend agiert der GC nicht schnell genug und lässt die alten Arrays zu, bevor die neuen zugewiesen werden - was die OOM verursacht - während sie vor den neuen Allokationen freigegeben werden sollten genug.
Was ich suche ist eine Möglichkeit, so etwas zu tun:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
Ich bin nicht sicher, ob eine vollständige Garbage collecion eine gute Idee, da dieser Code wäre kann (in manchen Situationen) müssen ziemlich oft ausgeführt werden.
Gibt es einen geeigneten Weg, dies zu tun?
Es scheint wirklich seltsam, dass dies eine OOM-Ausnahme verursachen würde. Haben Sie einen Beispielcode, der das Problem veranschaulicht? – aquinas
Dies ist Teil eines ziemlich großen (noch unveröffentlichten) Programms und leider kann ich nur kleine Ausschnitte des eigentlichen Codes posten, nichts groß genug, um kompilierbar zu sein. –
Ihr Problem besteht nicht in der Speicherverwaltung, sondern darin, dass Sie zu große Arrays verwenden. Warum glauben Sie, dass Sie diese großen Arrays in erster Linie brauchen? Wofür verwenden Sie sie? – Guffa