2013-11-26 2 views
1

Я пытаюсь построить данные в реальном времени, полученные сервером, при этом увеличивается объем памяти моего процессора (ОС Windows XP), я принял последние обновления, сделанные Luke-campagnola, по ссылке «http://bazaar.launchpad.net/~luke-campagnola/pyqtgraph/inp/files/312/tools/debian/»Объем памяти RAM увеличивается при генерации графика Two Axix с использованием pyQtGraph

любая помощь или предложение приветствуются заранее.

Я прилагаю весь код здесь ...

import sys 
from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 
import collections 
import random 
import time 
import math 
import numpy as np 
from pyqtgraph.ptime import time 


class DynamicPlotter(QtGui.QWidget): 
    def __init__(self, parent = None):  
     QtGui.QWidget.__init__(self, parent) 

     sampleinterval=0.1 
     self.myvar = 0 
     self.prevdt=0 
     self.dt1 = 0 


     app = QtGui.QApplication([]) 

     self.plot_param1 = [] 
     self.plot_param2 = [] 
     self.plot_param3 = [] 
     self.plot_param4 = [] 
     for g in range(0,100): 
      self.plot_param1.append(g/100) 
      self.plot_param2 .append((g+1)/100) 
      self.plot_param3.append(g/100) 
      self.plot_param4.append((g+1)/100) 

     self.samplesize = 100; 
     self.samples  = range(0,self.samplesize) 

     for i in range(len(self.samples)): 
      self.samples[i] = self.samples[i]/100.0 

     self.framecount = 0; 

     pg.mkQApp() 
     self.pw = pg.PlotWidget() 

     self.pw.show() 
     self.p1 = self.pw.plotItem 
     self.p2 = pg.ViewBox() 
     self.p1.showAxis('right') 
     self.p1.scene().addItem(self.p2) 
     self.p2.setGeometry(self.p1.vb.sceneBoundingRect()) 
     self.p1.getAxis('right').linkToView(self.p2) 
     self.p2.setXLink(self.p1) 

     self.pw.setLabel('bottom', 'Time in Secs') 
     self.pw.setLabel('left', 'Velocity in rpm') 
     self.pw.setLabel('right', 'load in Nm') 

    def update(self): 

     self.p1.plot(self.samples, self.plot_param3) 

     self.p2.addItem(self.p1.plot(self.samples, self.plot_param4, pen='b')) 


     self.dt1 = self.dt1+1 

     self.p1.setYRange(min(self.plot_param3), max(self.plot_param3)) 
     self.p2.setXRange(self.dt1-1,self.dt1) 
     self.p2.setYRange(min(self.plot_param4), max(self.plot_param4)) 

     if self.framecount == 0:  
      flushloop = self.samplesize 
     else: 
      flushloop = self.samplesize+1 

     for flush in range(1,flushloop):  

      self.samples.pop(0) 


    # below code is to prepare for next sample 
    self.framecount = self.framecount + 1 
    k=0 
    for update in range(self.framecount*self.samplesize, 
     self.framecount*self.samplesize+self.samplesize): 
     if(0): 
      self.plot_param1.append(self.framecount+(update/2)) 
      self.plot_param2.append(self.framecount+ (update/2)) 
      self.myvar=self.myvar-1 
     else: 
      self.myvar=self.myvar+1 
      #self.plot_param2.append(self.framecount+ (update/2)) 
      #self.plot_param1.append(self.framecount+(update/2)) 


     self.samples.append(update/100.0) 

if(self.dt1<100): 
    self.plot_param1 = np.cos(np.linspace(0, 2*np.pi, 101)) 
    self.plot_param3 = self.plot_param1.tolist() 
    self.plot_param2 = np.sin(np.linspace(0, 4*np.pi, 101)) 
    self.plot_param4 = self.plot_param2.tolist() 

if((self.dt1>=100)and (self.dt1 < 200)): 
    self.plot_param1 = np.cos(np.linspace(0, 20*np.pi, 101)) 
    self.plot_param3 = self.plot_param1.tolist() 
    self.plot_param2 = np.sin(np.linspace(0, 40*np.pi, 101)) 
    self.plot_param4 = self.plot_param2.tolist() 

if((self.dt1>=200)and (self.dt1 < 300)): 
    for f in range(0,100): 

     self.plot_param1 = np.cos(np.linspace(0, 20*np.pi, 101)) 
    self.plot_param3 = self.plot_param1.tolist() 
    #self.plot_param3.append(1+f) 
    self.plot_param2 = np.cos(np.linspace(0, 20*np.pi, 101)) 
    #self.plot_param4.append(3+f) 
    self.plot_param4 = self.plot_param2.tolist() 




if(self.dt1 >= 300): 
    self.plot_param1 = np.cos(np.linspace(0, 10*np.pi, 101)) 
    self.plot_param3 = self.plot_param1.tolist() 
    self.plot_param2 = np.sin(np.linspace(0, 80*np.pi, 101)) 
    self.plot_param4 = self.plot_param2.tolist() 



    for i in range (len(self.plot_param3)): 

     self.plot_param3[i] = 20 * self.plot_param3[i] 



if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv)  
    myapp = DynamicPlotter() 
    for i in range(0,100): 
     myapp.update() 


    timer = QtCore.QTimer()   
    timer.timeout.connect(myapp.update) 
    timer.start(50) 

ответ

1

Есть несколько проблем с кодом вы публикуемым:

  1. update() добавляет новые кривые графика в сцену каждый раз, когда он , что, вероятно, является причиной использования вашей памяти. Это также повлияет на производительность. Чтобы это исправить, вы можете вызвать self.p1.clear() в начале update()

  2. код пытается создать экземпляр QApplication, по крайней мере в три раза, что может привести к аварии или зависания:

    • DynamicPlotter.__init__ имеет линию app = QtGui.QApplication([])
    • DynamicPlotter.__init__ имеет другую линию pg.mkQApp(), который делает то же самое
    • __main__ блок в нижней части также вызывает QtGui.QApplication([])

    Обратите внимание, что QApplication() будет вызываться один раз для каждого экземпляра DynamicPlotter. Функция pg.mkQApp() безопасна для вызова несколько раз, потому что она проверяет, была ли уже создана QApplication.

  3. DynamicPlotter является подклассом QWidget, но не отображается и не используется в качестве виджета. Это незначительная проблема, но позже может возникнуть путаница.

0

Я обновил код в соответствии с вашими комментариями, я смог решить проблему с памятью.

Когда я пошел, чтобы отладить проблему памяти, я также заметил, что

1) File PlotItem.py function addItem() has 
    self.items.append(item) 
    self.dataItems.append(item) 
    self.curves.append(item) 

2) File ViewBox.py function addItem() has 
    self.addedItems.append(item) 

Вышеупомянутый 4 элементов списка продолжает накапливать, они не выпускают ранее сохраненный экземпляр.

Не очень уверен, почему это необходимо для накопления, я удалил массив, используя приведенные ниже команды.

del self.items [0:len(self.items)] 
del self.dataItems [0:len(self.dataItems)] 
del self.curves [0:len(self.curves)] 
del self.addedItems [0:len(self.addedItems)] 

Я не нашел никакой проблемы, добавив выше 4 строки команды. Не могли бы вы рассказать об этом.

С уважением, Pradeep K.