Я использую 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()
Проблема заключается в том, что использование памяти для процесса python увеличивается на пару мегабайт при каждом вызове этой функции. Например, если я вызываю его с помощью этого цикла:
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.