Les erreurs Matplotlib entraînent une fuite de mémoire. Comment puis-je libérer de la mémoire?

j'exécute une application django qui inclut matplotlib et permet à l'utilisateur de spécifier les axes du graphe. Cela peut se traduire par "erreur de débordement: complexité Agg dépassée "

quand cela se produit jusqu'à 100 Mo de RAM se ligoter. Normalement, je libère cette mémoire en utilisant fig.gcf() , plot.close() , et gc.collect() , mais la mémoire associée à l'erreur ne semble pas être associée à l'objet plot.

Does quelqu'un sait comment je peux libérer ce souvenir?

Merci.

voici un code qui me donne L'erreur de complexité 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()
10
demandé sur sequoia 2011-08-19 22:20:20

2 réponses

je suppose que vous pouvez lancer le code que vous avez posté au moins une fois. Le problème ne se manifeste qu'après l'exécution de la posté plusieurs fois. - Il Correct?

si c'est le cas, ce qui suit évite le problème sans vraiment identifier la source du problème. Peut-être que c'est une mauvaise chose, mais cela fonctionne dans un pincement: il suffit d'utiliser multiprocessing pour exécuter le code intensif en mémoire dans un processus séparé. Vous n'avez pas à vous soucier de fig.clf() ou plt.close() ou del a,b ou gc.collect() . Toute mémoire est libérée à la fin du processus.

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()

vous n'avez pas à proc.join() non plus. Le join bloque le processus principal jusqu'à la fin du worker . Si vous omettez le join , alors le processus principal continue simplement avec le processus worker travaillant dans l'arrière-plan.

10
répondu unutbu 2011-08-19 18:33:15

je trouve ici http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html il donne une réponse intéressante qui peut aider à

essayer de remplacer:

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

avec

from matplotlib import figure
fig = figure.Figure()
11
répondu oli 2012-09-06 12:44:40