【问题标题】:Python leaking memory while using PyQt and matplotlibPython 在使用 PyQt 和 matplotlib 时泄漏内存
【发布时间】:2010-11-17 23:07:16
【问题描述】:

我在 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') 命令似乎正在吞噬内存。

非常感谢任何帮助!

【问题讨论】:

  • 如果你想与GUI一起使用,千万不要使用pyplot创建图形,而是使用图形创建图形实例。

标签: python memory-leaks pyqt matplotlib


【解决方案1】:

似乎某些后端正在泄漏内存。尝试明确设置您的后端,例如

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

【讨论】:

  • 谢谢!这工作得很好。我将不得不查看您答案的更多细节。
【解决方案2】:

pyplot 接口旨在易于交互使用,但对于嵌入应用程序,面向对象的 API 更好。例如,pyplot 会跟踪您创建的所有图形。您的plot.close(figure) 应该 摆脱它们,但也许它不会被执行 - 尝试将其放入 finally 或重复使用相同的图形对象。

参见this example 使用面向对象的 API 在 PyQt4 应用程序中嵌入 matplotlib。这是更多的工作,但由于一切都是明确的,你不应该从 pyplot 所做的幕后自动化中得到内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2016-08-06
    • 2017-10-18
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多