The*_*ude 5 python plot memory-leaks pyqtgraph
我正在使用 PyQtGraph 来快速可视化我的数据采集。为此,我不断地使用while循环重绘数据。此代码的简化版本如下:
import time
import numpy
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
x = numpy.linspace(-2 * numpy.pi, 2 * numpy.pi, 1000)
y = numpy.cos(x)
# Plot
win = pg.GraphicsWindow()
win.resize(800, 800)
p = win.addPlot()
p.plot(x, y, pen = "y")
i = 0
while i < 5000:
start_time = time.time()
noise = numpy.random.normal(0, 1, len(y))
y_new = y + noise
p.plot(x, y_new, pen = "y", clear = True)
p.enableAutoRange("xy", False)
pg.QtGui.QApplication.processEvents()
i += 1
end_time = time.time()
print("It has been {0} seconds since the loop started".format(end_time - start_time))
win.close()
Run Code Online (Sandbox Code Playgroud)
当我每次迭代计时时,我发现我没有正确清除图形。迭代时间不断增加,我正在减慢我的数据采集速度。对于上面的示例,开始时的迭代时间约为 ,0.009 s而结束时约为0.04 s。因此,我有内存泄漏。
我知道在matplotlib我应该打电话是clf()正确清除情节。不幸的是,我对 PyQtGraph 不太熟悉,并认为它clear = True会解决这个问题。我相信它应该是可能的,因为它PyQtGraph是为这种类型的使用而设计的。
我应该如何在每次迭代时清除图表以确保不会减慢数据采集速度?
当你在 plotItem 上调用 plot 时,你创建了一个新的 plotDataItem。所有这些 plotDataItems 似乎都没有正确清理。您可以改为尝试仅使用一个 plotDataItem 并更新其内容。使用
plot = p.plot(x, y, pen = "y")
Run Code Online (Sandbox Code Playgroud)
然后在你的循环中
plot.setData(x, y_new)
Run Code Online (Sandbox Code Playgroud)