如何解决Python3 - Matplotlib FuncAnimation 连续内存泄漏
EDIT2:
因此,经过更多的工作,我创建了最小的样本,它在每台机器上都可以很好地再现 Memoryleak。 这段代码只是创建了一个 TKinter 窗口和一个带有 3 个正弦波的 matplotlib 画布,然后尝试动画。看到 blit 是真的,所以它不应该做任何事情,因为绘图没有改变。
我也尝试了这篇文章中的方法 How can I release memory after creating matplotlib figures
gc.collect() - 什么都没做
axes.clear - 它确实阻止了无休止的内存泄漏,但也完全搞砸了图片
figure.clf - 与 clear 相同但更糟。
任何其他想法为什么 FuncAnimation 的内存使用量会随着时间的推移而增加??????? 谢谢
import tkinter as tk
from threading import Thread
from numpy import sin,cos,pi
#--Mainwindow--
class Drehstromdemonstrator(tk.Tk):
def __init__(self):
#Predefine
tk.Tk.__init__(self)
tk.Tk.wm_title(self,"Minimal")
container = tk.Frame(self)
container.pack(side="top",fill="both",expand=True)
container.grid_rowconfigure(0,weight=1)
container.grid_columnconfigure(0,weight=1)
self.frame = plotSine(self,(tk.Tk.winfo_screenwidth(self)*0.7,tk.Tk.winfo_screenheight(self)*0.7))
import numpy,matplotlib
matplotlib.use('TkAgg')
from numpy import sin,pi,deg2rad,linspace,arange
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.ticker as tck
import time
import math
from matplotlib.backends.backend_tkagg import figureCanvasTkAgg
from matplotlib.figure import figure
from math import ceil
global U1ausg,U2ausg,U3ausg,Counter_1,Counter_2,Counter_3
U1ausg = U2ausg = U3ausg = Counter_3 = 50
Counter_1 = 120
Counter_2 = 240
class plotSine:
def __init__(self,masterframe,size):
self._running = True
global U1ausg
global U2ausg
global U3ausg
(w,h) = size
inchsize = (w/25.5,h/25.4)
fig = self.figure = figure(inchsize)
self.axes = fig.add_subplot(111)
self.axes.xaxis.set_ticks(arange(0,390,30))
self.axes.margins(x=0)
self.axes.yaxis.set_ticks(arange(-120,130,20))
self.axes.set_ylim(-120,120)
#create canvas as matplotlib drawing area
self.canvas = figureCanvasTkAgg(fig,master=masterframe)
self.canvas.get_tk_widget().pack()
self.x = linspace(0,360,1000)
self.axes.grid()
#self.drawStuff()
#Draw the plot
def drawStuff(self,*args):
ax = self.axes
self.axes.legend(["U1","U2","U3"])
#Changed everything to degree instead of PI,better looking
ysin = int(ceil(U1ausg))*sin(50/Counter_3 * deg2rad(self.x))
ysin2 = int(ceil(U2ausg))*sin(50/Counter_3 * deg2rad(self.x) + deg2rad(Counter_1))
ysin3 = int(ceil(U3ausg))*sin(50/Counter_3 * deg2rad(self.x) + deg2rad(Counter_2))
lineU1 = ax.plot(self.x,ysin,"-r",label="U1")
lineU2 = ax.plot(self.x,ysin2,"-g",label="U2")
lineU3 = ax.plot(self.x,ysin3,"-b",label="U3")
return [*lineU1,*lineU2,*lineU3]
#Animation to redraw when value changed
def animate(self):
self.ani = animation.FuncAnimation(self.figure,self.drawStuff,interval=10,blit=True)
#--Run Mainprog
try:
app = Drehstromdemonstrator()
plt.show()
app.frame.animate()
app.mainloop
# Aufraeumarbeiten nachdem das Programm beendet wurde
except UnicodeDecodeError:
print("Interrupt aswell!")
lampensteuerung.terminate()
except KeyboardInterrupt:
print("Interrupt")
lampensteuerung.terminate()
except Exception as e:
print(e)
EDIT1:
通过反复尝试,我可以发现问题似乎出在我的 matplotlib 中,就好像我禁用它一样,内存增加停止了。
所以我的任务是从其他人那里完成这个项目——它通过覆盆子和一些灯来模拟一个三相系统。当我禁用 GUI 时,代码运行良好,没有问题,反应迅速。有时 PI 说他电压低,但我只是认为这是一些奇怪的错误,因为电源确实足以为其供电。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。