PyQtはとmatplotlibのを使用しながら、Pythonはメモリリーク
-
12-09-2019 - |
質問
私は、ユーザーがボタンをクリックしたときにmatplotlibのを使用してPNGグラフを作成するPythonの小さなPyQtはベースのユーティリティを作成しました。すべては最初の数回のクリック時にうまく機能、しかし画像が作成されるたびに、アプリケーションのメモリフットプリントは、最終的には完全にはPythonをクラッシュ、約120 MBの成長ます。
グラフが作成された後、どのように私はこのメモリを回復することができますか?私はここに私のコードの簡易版を用意しました。
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_())
plot.savefig( 'graph.png')コマンドは、メモリをgobblingているもののようです。
私は非常に任意のヘルプをいただければと思います!
解決
いくつかのバックエンドがメモリをリークしているようです。例えば、明示的にあなたのバックエンドを設定してみてください。
import matplotlib
matplotlib.use('Agg') # before import pylab
import pylab
他のヒント
pyplotインターフェイスは、簡単に対話的に使用するためのものが、アプリケーションにオブジェクト指向のAPIを埋め込むためのより良いです。例えば、pyplotには、作成したすべての人物を追跡します。あなたのplot.close(figure)
はののそれらを取り除く必要がありますが、多分それは実行されません - finally
内に置くか、同じ図のオブジェクトを再利用してみてください。
客体を用いPyQt4アプリケーションでmatplotlibのを埋め込むをこの例を参照してください指向API。それはより多くの仕事だが、すべてが明示的であることから、あなたはありませんpyplot舞台裏の自動化からメモリリークを取得するべきではありません。
所属していません StackOverflow