2009-08-08 5 views
6

Я создал небольшую утилиту на основе PyQt в Python, которая создает графики PNG, используя matplotlib, когда пользователь нажимает кнопку. Все работает хорошо в течение первых нескольких кликов, однако каждый раз, когда создается изображение, объем памяти приложения увеличивается примерно на 120 МБ, в конечном итоге сбой Python.Python утечка памяти при использовании PyQt и matplotlib

Как восстановить эту память после создания графика? Я включил упрощенную версию моего кода здесь:

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») команда, кажется, что уплетая память.

Буду признателен за любую помощь!

ответ

7

Кажется, что некоторые серверы утечки памяти. Попробуйте установить свой бэкенд явно, например.

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

Спасибо! Это работало очень хорошо. Мне нужно будет подробнее изучить ваш ответ. –

6

Интерфейс pyplot предназначен для простого интерактивного использования, но для внедрения в приложение объектно-ориентированный API лучше. Например, pyplot отслеживает все созданные вами рисунки. Ваш plot.close(figure)должен избавиться от них, но, возможно, он не будет выполнен - ​​попробуйте поместить его внутри finally или повторно использовать тот же объект фигуры.

См. this example внедрения matplotlib в приложении PyQt4 с использованием объектно-ориентированного API. Это больше работает, но поскольку все явно, вы не должны получать утечки памяти из закулисной автоматизации, которую делает pyplot.

 Смежные вопросы

  • Нет связанных вопросов^_^