Używam matplotlib do generowania wielu wykresów wyników symulacji numerycznej. Działki są wykorzystywane jako klatek filmu, a więc jestem generowania wielu z nich kilkakrotnie wywołanie funkcji podobny do tego:Python matplotlib: pamięć nie jest zwolniona przy określaniu rozmiaru rysunku
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()
Problemem jest to, że użycie pamięci procesu Pythona rośnie przez kilka megabajtów przy każdym wywołaniu tej funkcji. Na przykład, jeśli zadzwonię do tej pętli:
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
, a następnie wykorzystanie pamięci RAM rośnie z czasem do 600 MB. Jeśli jednak w definicji funkcji skomentuję linię figure(figsize=(8,6))
, to użycie pamięci pozostaje stałe na poziomie 52 MB. (8,6)
to domyślny rozmiar figury, a więc identyczne obrazy są tworzone w obu przypadkach. Chciałbym tworzyć wykresy o różnych rozmiarach z moich danych liczbowych bez wyczerpania pamięci RAM. Jak mogę zmusić Pythona do zwolnienia tej pamięci?
Próbowałem gc.collect()
każdej pętli zmusić zbieranie śmieci, a próbowałem f = gcf()
aby uzyskać aktualny rysunek, a następnie del f
aby go usunąć, ale bezskutecznie.
Używam CPython 2.6.5 na 64-bitowym systemie Ubuntu 10.04.
To prawda! Dziękuję bardzo. –
Tak, 'clf' nie usuwa figury ani nie zwalnia jej zasobów, tylko ją usuwa. Oraz 'f = gcf(); del f' usuwa tylko utworzoną referencję, nie usuwa samego obiektu figurki. Właśnie tego potrzebujesz "zamknąć". (+1) –