matplotlib, figure, savefig und memory leaks

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mitti
User
Beiträge: 4
Registriert: Mittwoch 29. Juli 2009, 12:20

Hallo zusammen,

ich hab' ein kleines Problem mit der matplotlib.
Folgender Code verbraucht bei mir in jedem Schleifendurchlauf zusätzlich Speicher


Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

##erzeuge Nonsens-Daten
matrix = np.random.rand(10,10)

for i in range(10000):
    pic = plt.figure(1)
    ax = pic.add_subplot(111)
    ax.imshow(matrix)
    plt.savefig('test.png')
    plt.close(pic)

Folgender Code erzeugt kein Memory Leak:

Code: Alles auswählen

matrix = np.random.rand(10,10)
for i in range(10000):
    picture = figure.Figure()
    picture.add_subplot(111)
    picture.gca().imshow(matrix)
    picture.savefig('D:\\temp\\test.png')
    picture.clf()    
Allerdings kommt die Fehlermeldung das Attribut Canvas von pic sei None. Im Original:
File "c:\python25\lib\site-packages\matplotlib-0.98.5.2n1-py2.5-win32.egg\matplotlib\figure.py", line 990, in savefig
self.canvas.print_figure(*args, **kwargs)
AttributeError: 'NoneType' object has no attribute 'print_figure'
Weiss jemand von Euch Rat? Ich habe mich bereitst durch alle möglichen und unmöglichen Mailinglisten gelesen. Angeblich hat die Matplotlib selber keine Memory leaks, aber je nachdem wie man sie einbaut (insbesondere auch mit pylab) kann es sein, dass einige Dinge sehr lange im Speicher gehalten werden.
Achja, "del" oder den garbage-Collector hab' ich auch schon ausprobiert, das hat mir nicht geholfen.

Viele Grüße und vielen Dank
Mitti
User
Beiträge: 4
Registriert: Mittwoch 29. Juli 2009, 12:20

Also,...
ich weiss zwar immer noch nicht warum, aber ich habe eine Variante gefunden, die funktioniert.

Code: Alles auswählen

import numpy as np
import matplotlib.pylab as plt

matrix = np.random.rand(10,10)
for i in range(10000):
    
    picture = plt.figure(1)
    ax = picture.add_subplot(111)
    ax.imshow(matrix)
    plt.savefig('D:\\temp\\test.png')
    picture.clf()   
    #plt.close(picture)


Erstaunlicherweise tritt das memory leak wieder auf, wenn man das auskommentiere "plt.close(picture)" wieder ins Programm einbaut. Das scheint ein Verhalten von pylab zu sein. Möglichweise gewünscht, vielleicht ist es ja im interaktiven Betrieb nützlich Daten im Speicher zu halten, obwohl die zugehörige figure nicht mehr existiert. :K
Nuja, falls jemand eine Erklärung hat, wäre ich sehr gespannt.
Antworten