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!
Danke! Das hat sehr gut funktioniert. Ich werde mir mehr Details Ihrer Antwort ansehen müssen. –