Domanda

Ho creato un programma di utilità basato piccolo PyQt in Python che crea i grafici PNG utilizzando matplotlib quando un utente fa clic su un pulsante. Tutto funziona bene durante i primi scatti, però ogni volta che si crea un'immagine, footprint di memoria dell'applicazione cresce di circa 120 MB, infine schiantarsi Python del tutto.

Come posso recuperare questa memoria dopo aver creato un grafico? Ho incluso una versione semplificata del mio codice qui:

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

Il plot.savefig ( 'graph.png') il comando sembra essere quello che sta inghiottendo la memoria.

Apprezzerei molto di aiuto!

È stato utile?

Soluzione

Sembra che alcuni backend sono perdite di memoria. Prova a impostare il vostro back-end in modo esplicito, per es.

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

Altri suggerimenti

L'interfaccia pyplot è inteso per un facile utilizzo interattivo, ma per l'incorporamento in un'applicazione API orientata agli oggetti è migliore. Ad esempio, pyplot tiene traccia di tutte le figure che avete creato. Il tuo plot.close(figure) dovrebbe sbarazzarsi di loro, ma forse non viene eseguita -. Prova a mettere dentro finally o riutilizzare lo stesso oggetto cifra

questo esempio di incorporare matplotlib in un'applicazione PyQt4 utilizzando l'oggetto- API orientato. E 'più di lavoro, ma dal momento che tutto è esplicito, non si dovrebbe ottenere perdite di memoria dalla automazione dietro le scene che pyplot fa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top