سؤال

لقد قمت بإنشاء أداة مساعدة قائم على PYQT صغيرة في Python التي تنشئ رسوم بيانية PNG باستخدام MatplotLib عندما ينقر المستخدم على زر. كل شيء يعمل بشكل جيد خلال النقرات القليلة الأولى، ولكن في كل مرة يتم إنشاء صورة، ينمو بصمة الذاكرة في تطبيق التطبيق حوالي 120 ميغابايت، في النهاية تعطل بيثون تماما.

كيف يمكنني استعادة هذه الذاكرة بعد إنشاء رسم بياني؟ لقد قمت بتضمين نسخة مبسطة من التعليمات البرمجية الخاصة بي هنا:

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_())

يبدو الأمر Craze.Savefig ('graph.png') هو ما يلهى الذاكرة.

كنت أقدر كثيرا أي مساعدة!

هل كانت مفيدة؟

المحلول

يبدو أن بعض الذاكرة تسريب الذاكرة. حاول تحديد الخلفية الخاصة بك صراحة، على سبيل المثال

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

نصائح أخرى

واجهة Pyplot مخصصة للاستخدام التفاعلي السهل، ولكن من أجل التضمين في تطبيق API الموجه للكائن هو أفضل. على سبيل المثال، تتبع Pyplot من جميع الأرقام التي قمت بإنشائها. لك plot.close(figure) ينبغي تخلص منهم، ولكن ربما لا يتم تنفيذها - حاول وضعها في الداخل finally أو إعادة استخدام نفس الكائن الشكل.

يرى هذا المثال من تضمين matplotlib في تطبيق PYQT4 باستخدام API الموجهة للكائنات. إنه أكثر عمل، ولكن نظرا لأن كل شيء صريح، يجب ألا تحصل على تسرب الذاكرة من أتمتة الكواليس التي يقوم بها Pyplot.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top