Frage

Ich habe ein kleine PyQt basiertes Dienstprogramm in Python erstellt, die PNG-Graphiken mit matplotlib erstellt, wenn ein Benutzer auf eine Schaltfläche klickt. Alles funktioniert gut in den ersten paar Klicks, aber jedes Mal, wenn ein Bild erzeugt wird, der Speicherbedarf der Anwendung wächst etwa 120 MB, schließlich Python stürzt zusammen.

Wie kann ich diesen Speicher wiederherzustellen, nachdem ein Diagramm erstellt wird? Ich habe eine vereinfachte Version meines 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 den Speicher des verschlang.

ich sehr jede mögliche Hilfe schätzen würde!

War es hilfreich?

Lösung

Es scheint, dass einige Backends Speicher undicht sind. Versuchen Sie, Ihre Backend explizit einstellen, z.

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

Andere Tipps

Die pyplot Schnittstelle ist für die einfache interaktive Nutzung gemeint, aber besser in einer Anwendung die objektorientierte API ist für die Einbettung. Zum Beispiel hält pyplot den Überblick über alle Figuren, die Sie erstellt haben. Ihre plot.close(figure) sollte sie loszuwerden, aber vielleicht ist es nicht ausgeführt werden sollen -. Versuchen, es in finally setzen oder die gleiche Figur Objekt Wiederverwendung

Siehe dieses Beispiel matplotlib in einer PyQt4 Anwendung mit dem objekt- der Einbettung orientierte API. Es ist mehr Arbeit, aber da alles explizit ist, sollten Sie nicht Speicherlecks aus dem Blick hinter die Kulissen, die Automatisierung pyplot der Fall ist.

erhalten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top