Los errores de Matplotlib dan como resultado una pérdida de memoria. ¿Cómo puedo liberar esa memoria?

Estoy ejecutando una aplicación django que incluye matplotlib y le permite al usuario especificar los ejes del gráfico. Esto puede dar como resultado ‘Error de desbordamiento: se ha excedido la complejidad de Agg’

Cuando eso sucede, hasta 100MB de RAM se atan. Normalmente fig.gcf() esa memoria usando fig.gcf() , plot.close() y gc.collect() , pero la memoria asociada con el error no parece estar asociada con el objeto plot.

¿Alguien sabe cómo puedo liberar esa memoria?

Gracias.

Aquí hay un código que me da el error de complejidad de Agg.

 import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np import gc a = np.arange(1000000) b = np.random.randn(1000000) fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w') fig.set_size_inches(10,7) ax = fig.add_subplot(111) ax.plot(a, b) fig.savefig('yourdesktop/random.png') # code gives me an error here fig.clf() # normally I use these lines to release the memory plt.close() del a, b gc.collect() 

Supongo que puedes ejecutar el código que publicaste al menos una vez. El problema solo se manifiesta después de ejecutar el código publicado muchas veces. ¿Correcto?

Si es así, lo siguiente evita el problema sin identificar realmente la fuente del problema. Tal vez eso sea algo malo, pero esto funciona en un apuro: simplemente use el multiprocessing para ejecutar el código de uso intensivo de memoria en un proceso separado. No tiene que preocuparse por fig.clf() o plt.close() o del a,b o gc.collect() . Toda la memoria se libera cuando el proceso termina.

 import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np import multiprocessing as mp def worker(): N=1000000 a = np.arange(N) b = np.random.randn(N) fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w') fig.set_size_inches(10,7) ax = fig.add_subplot(111) ax.plot(a, b) fig.savefig('/tmp/random.png') # code gives me an error here if __name__=='__main__': proc=mp.Process(target=worker) proc.daemon=True proc.start() proc.join() 

No tienes que proc.join() tampoco. La join bloqueará el proceso principal hasta que el worker finalice. Si omite la join , entonces el proceso principal simplemente continúa con el proceso de trabajo trabajando en segundo plano.

Encuentro aquí http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html , da una respuesta interesante que puede ayudar

intente reemplazar:

 import matplotlib.pyplot as plt fig = plt.figure() 

con

 from matplotlib import figure fig = figure.Figure()