Я использую matplotlib для генерации множества графиков результатов численного моделирования. Графики используются как кадры в видео, и поэтому я генерируя многие из них неоднократно вызывая функцию, похожую на эту:Python matplotlib: память не выделяется при определении размера фигуры
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()
Проблема заключается в том, что использование памяти процесса питона растет пара мегабайт с каждым вызовом этой функции. Например, если я назову его с помощью этого цикла:
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
затем использование плунжера увеличивается со временем до 600 МБ. Если, однако, я прокомментирую строку figure(figsize=(8,6))
в определении функции, то использование плунжера остается стабильным на уровне 52 МБ. (8,6)
- это размер фигуры по умолчанию, и поэтому одинаковые изображения создаются в обоих случаях. Я хотел бы сделать графики разного размера из своих числовых данных, не исчерпываясь. Как я могу заставить python освободить эту память?
Я попытался gc.collect()
каждая петля для принудительного сбора мусора, и я попытался f = gcf()
получить текущую фигуру, а затем del f
удалить его, но безрезультатно.
Я запускаю CPython 2.6.5 на 64-разрядном Ubuntu 10.04.
Это делает его! Огромное спасибо. –
Да, 'clf' не удаляет фигуру или не отпускает ее ресурсы, она только очищает ее. И 'f = gcf(); del f' удаляет только что созданную ссылку, она не удаляет сам объект фигуры. Это то, что вам нужно «закрыть». (+1) –