2009-08-08 12 views
6

Python'da, kullanıcı bir düğmeyi tıkladığında matplotlib kullanılarak PNG grafikleri oluşturan küçük bir PyQt tabanlı yardımcı program oluşturdum. Her şey ilk birkaç tıklama sırasında iyi çalışır, ancak bir görüntü her oluşturulduğunda, uygulamanın bellek ayak izi yaklaşık 120 MB büyür, sonunda Python'u tamamen çökertir.PyQt ve matplotlib kullanırken belleği sızdıran Python

Grafik oluşturulduktan sonra bu belleği nasıl kurtarabilirim?

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') komutu bellek yutuyor Ne gibi görünüyor: Benim burada kod basitleştirilmiş bir sürümünü dahil ettik.

Herhangi bir yardım için minnettar olurum!

cevap

7

Bazı arka uçların bellek sızdırıyor gibi görünüyor. Arka ucunu açıkça belirlemeye çalışın, örn.

+0

Teşekkürler! Bu çok iyi çalıştı. Cevabınızın daha fazla ayrıntıya bakması gerekecek. –

6

Pyplot arabirimi, kolay etkileşimli kullanım içindir, ancak bir uygulamaya gömmek için nesneye yönelik API daha iyidir. Örneğin, pyplot oluşturduğunuz tüm rakamların kaydını tutar. plot.close(figure),'u bunlardan kurtulmalıdır, ancak belki de idam edilmez - finally'un içine yerleştirmeyi veya aynı şekil nesnesini yeniden kullanmayı deneyin. Nesne yönelimli API'yi kullanarak bir PyQt4 uygulamasında matplotlib dosyasını gömme işleminin this example numaralı sayfasına bakın. Daha fazla iş, ama her şey açık olduğu için, pikselin yaptığı sahne arkası otomasyonundan bellek sızıntısı almamalısınız.