2009-08-08 14 views
6

Ich habe ein kleines PyQt-basierte Dienstprogramm in Python erstellt, das PNG-Diagramme mit Matplotlib erstellt, wenn ein Benutzer auf eine Schaltfläche klickt. Alles funktioniert gut während der ersten paar Klicks, aber jedes Mal, wenn ein Image erstellt wird, wächst der Speicherbedarf der Anwendung um etwa 120 MB, was Python letztendlich zum Absturz bringt.Python undichtem Speicher bei der Verwendung von PyQt und Matplotlib

Wie kann ich diesen Speicher wiederherstellen, nachdem ein Diagramm erstellt wurde? Ich habe eine vereinfachte Version von meinem Code hier enthalten:

import datetime as dt 
from datetime import datetime 
import os 
import gc 
# For Graphing 
import matplotlib 
from pylab import figure, show, savefig 
from matplotlib import figure as matfigure 
from matplotlib.dates import MonthLocator, WeekdayLocator, DateFormatter, DayLocator 
from matplotlib.ticker import MultipleLocator 
import matplotlib.pyplot as plot 
import matplotlib.ticker as ticker 
# For GUI 
import sys 
from PyQt4 import QtGui, QtCore 

class HyperGraph(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle('Title') 
     self.create_widgets() 

    def create_widgets(self): 
     grid = QtGui.QGridLayout() 
     self.generate_button = QtGui.QPushButton("Generate Graph", self) 
     grid.addWidget(self.generate_button, 1, 1) 
     QtCore.QObject.connect(self.generate_button, QtCore.SIGNAL("clicked()"), self.generate_graph) 

    def generate_graph(self): 
     try: 
      fig = figure() 
      ax = fig.add_axes([1,1,1,1]) 

      # set title 
      ax.set_title('Title') 

      # configure x axis 
      plot.xlim(dt.date.today() - dt.timedelta(days=180), dt.date.today()) 
      ax.set_xlabel('Date') 
      fig.set_figwidth(100) 

      # configure y axis 
      plot.ylim(0, 200) 
      ax.set_ylabel('Price') 
      fig.set_figheight(30) 

      # export the graph to a png file 
      plot.savefig('graph.png') 

     except: 
      print 'Error' 

     plot.close(fig) 
     gc.collect() 

app = QtGui.QApplication(sys.argv) 
hyper_graph = HyperGraph() 
hyper_graph.show() 
sys.exit(app.exec_()) 

Die plot.savefig (‚graph.png‘) Befehl scheint zu sein, was die Erinnerung verschlang wird.

Ich würde jede Hilfe sehr schätzen!

Antwort

7

Es scheint, dass einige Backends Speicher verlieren. Versuchen Sie, Ihr Backend explizit, z. Die pyplot-Schnittstelle ist für eine einfache interaktive Verwendung gedacht, aber zum Einbetten in eine Anwendung ist die objektorientierte API besser geeignet.

import matplotlib 
matplotlib.use('Agg') # before import pylab 
import pylab 
+0

Danke! Das hat sehr gut funktioniert. Ich werde mir mehr Details Ihrer Antwort ansehen müssen. –

6

Zum Beispiel verfolgt pyplot alle von Ihnen erstellten Figuren. Ihr plot.close(figure)sollte loswerden, aber vielleicht wird es nicht ausgeführt - versuchen Sie es in finally oder die Wiederverwendung der gleichen Figur Objekt.

Siehe this example zum Einbetten von Matplotlib in eine PyQt4-Anwendung mithilfe der objektorientierten API. Es ist mehr Arbeit, aber da alles explizit ist, sollten Sie keine Speicherlecks aus der Automatisierung von hinter den Kulissen bekommen, die pyplot tut.

Verwandte Themen