Ho un problema in cui un paio di array tridimensionali allocano un'enorme quantità di memoria e il programma a volte ha bisogno di sostituirli con quelli più grandi/più piccoli e lancia un'eccezione OutOfMemoryException.Force Garbage Collection di array, C#
Esempio: ci sono 5 array assegnati da 96MB (200x200x200, 12 byte di dati in ogni voce) e il programma deve sostituirli con 210x210x210 (111MB). Lo fa in un modo simile a questo:
array1 = new Vector3[210,210,210];
Dove array1-array5 sono gli stessi campi utilizzati in precedenza. Questo dovrebbe impostare i vecchi array come candidati per la garbage collection ma apparentemente il GC non agisce abbastanza velocemente e lascia i vecchi array allocati prima di allocare quelli nuovi - il che causa l'OOM - mentre se essi dovessero liberare prima delle nuove allocazioni lo spazio dovrebbe essere abbastanza.
Quello che sto cercando è un modo per fare qualcosa di simile:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
Non sono sicuro se uno spazzatura collecion completa sarebbe una buona idea, dato che il codice può (in alcune situazioni) devono essere eseguiti abbastanza spesso.
Esiste un modo corretto per farlo?
Sembra davvero strano che ciò possa causare un'eccezione OOM. Avete qualche codice di esempio che dimostra il problema? – aquinas
Questo fa parte di un programma ragionevolmente grande (ancora inedito) e sfortunatamente posso pubblicare solo piccoli frammenti del codice attuale, niente di abbastanza grande da essere compilabile. –
Il problema non è la gestione della memoria, ma l'utilizzo di matrici troppo grandi. Perché pensi che hai bisogno di quei grandi array in primo luogo? Per cosa li stai usando? – Guffa