我已经创建在Python基于小PyQt的实用程序,创建使用matplotlib当用户点击一个按钮PNG图形。一切在最初几次点击的效果很好,在创建图像每次但是,应用程序的内存占用长约120 MB,最终崩溃的Python共

如何恢复此内存中创建的曲线图后?我已经包括了我的代码的简化版本在这里:

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')命令似乎是什么吞噬存储器中。

我会非常感谢任何帮助!

有帮助吗?

解决方案

似乎一些后端正在泄漏存储器。尝试明确设置你的后端,e.g。

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

其他提示

在pyplot接口是为容易交互使用,但在应用程序中嵌入面向对象的API更好。例如,pyplot跟踪你已经创建的所有数字。你plot.close(figure)的摆脱他们,但也许它没有得到执行 - 尽量把它里面finally或重复使用相同的图形对象

请参阅这个例子使用对象 - 在PyQt4的应用程序中嵌入matplotlib的面向API。这是更多的工作,但因为一切是明确的,你不应该从幕后的自动化是pyplot确实得到内存泄漏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top