Sto usando matplotlib per generare molti grafici dei risultati di una simulazione numerica. Le trame sono utilizzati come fotogrammi di un video, e quindi sono la generazione di molti di loro chiamando ripetutamente una funzione simile a questa:Matlotlib Python: memoria non rilasciata quando si specifica la dimensione della figura
from pylab import *
def plot_density(filename,i,t,psi_Na):
figure(figsize=(8,6))
imshow(abs(psi_Na)**2,origin = 'lower')
savefig(filename + '_%04d.png'%i)
clf()
Il problema è che l'utilizzo della memoria del processo di pitone cresce di un un paio di megabyte con ogni chiamata a questa funzione. Per esempio se lo chiamo con questo ciclo:
if __name__ == "__main__":
x = linspace(-6e-6,6e-6,128,endpoint=False)
y = linspace(-6e-6,6e-6,128,endpoint=False)
X,Y = meshgrid(x,y)
k = 1000000
omega = 200
times = linspace(0,100e-3,100,endpoint=False)
for i,t in enumerate(times):
psi_Na = sin(k*X-omega*t)
plot_density('wavefunction',i,t,psi_Na)
print i
quindi l'utilizzo di ram cresce con il tempo a 600 MB. Se tuttavia commento la riga figure(figsize=(8,6))
nella definizione della funzione, l'utilizzo della ram rimane costante a 52 MB. (8,6)
è la dimensione della cifra predefinita e in entrambi i casi vengono prodotte immagini identiche. Mi piacerebbe realizzare trame di dimensioni diverse dai miei dati numerici senza esaurire il ram. Come potrei costringere Python a liberare questa memoria?
Ho provato gc.collect()
ogni ciclo per forzare la raccolta dei rifiuti, e ho provato f = gcf()
per ottenere la cifra attuale e poi del f
di eliminarlo, ma senza alcun risultato.
Sto eseguendo CPython 2.6.5 su 64 bit Ubuntu 10.04.
che lo fa! Grazie mille. –
Sì, 'clf' non cancella la figura o rilascia le sue risorse, la cancella solo. E 'f = gcf(); del f' cancella solo il riferimento appena creato, non cancella l'oggetto stesso. Questo è quello che ti serve per "chiudere". (+1) –