2009-08-08 10 views
6

मैं अजगर में एक छोटा सा PyQt आधारित उपयोगिता है कि जब कोई उपयोगकर्ता किसी बटन पर क्लिक करता matplotlib का उपयोग कर पीएनजी रेखांकन बनाता बना लिया है। सबकुछ पहले कुछ क्लिकों के दौरान अच्छी तरह से काम करता है, हालांकि प्रत्येक बार जब कोई छवि बनाई जाती है, तो एप्लिकेशन की मेमोरी पदचिह्न लगभग 120 एमबी बढ़ता है, अंत में पाइथन को पूरी तरह दुर्घटनाग्रस्त कर देता है।पायथन स्मृति लीक 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') आदेश क्या स्मृति को gobbling है प्रतीत हो रहा है: मैं यहाँ मेरी कोड का एक सरलीकृत संस्करण शामिल किया है।

मैं बहुत किसी भी मदद की सराहना करते हैं!

उत्तर

7

ऐसा लगता है कि कुछ बैकेंड स्मृति लीक कर रहे हैं। अपने बैकएंड को स्पष्ट रूप से सेट करने का प्रयास करें, उदा।

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

धन्यवाद! यह बहुत अच्छा काम किया। मुझे आपके उत्तर के बारे में अधिक जानकारी देखना होगा। –

6

pyplot इंटरफेस आसान इंटरैक्टिव प्रयोग के लिए है, लेकिन एक आवेदन में एम्बेड करने के लिए वस्तु उन्मुख एपीआई बेहतर है। उदाहरण के लिए, pyplot आपके द्वारा बनाए गए सभी आंकड़ों का ट्रैक रखता है। आपका plot.close(figure)चाहिए उनमें से छुटकारा पाने के लिए, लेकिन शायद यह क्रियान्वित नहीं हो जाता है - finally अंदर डालने या एक ही आंकड़ा वस्तु पुन: उपयोग का प्रयास करें।

वस्तु उन्मुख एपीआई का उपयोग कर एक PyQt4 आवेदन में matplotlib एम्बेड करने के this example देखें। यह अधिक काम है, लेकिन चूंकि सबकुछ स्पष्ट है, आपको पाइपप्लॉट के पीछे के दृश्यों के स्वचालन से मेमोरी लीक नहीं मिलनी चाहिए।

संबंधित मुद्दे