我正在运行一个python程序,它每隔几分钟重新绘制一个图形,但每次运行它所使用的内存都会增加一点点,很快我会使用的树莓慢速爬行
这是相关的代码:
import matplotlib.pyplot as plt
import matplotlib.dates as md
from memory_profiler import profile
@profile
def plotter(file_name, plot_name):
with open(filen_name, 'r') as readings:
reader = csv.reader(readings, delimiter=',')
data = [row for row in reader]
plt.plot(data[2], data[0])
ax = gca()
xfmt = md.DateFormatter('%H:%M') # xaxis is datetimes
ax.xaxis.set_major_formatter(xfmt)
plt.legend()
plt.savefig(plot_name, transparent=True)
plt.clf()
plt.cla()
plt.close()
该函数调用类似于:
while True:
plotter(file_name, plot_name)
sleep(100)
memory_profiler吐出不错的输出,但它总是看起来像这样:
Line # Mem usage Increment Line Contents
================================================
38 36.2 MiB 0.6 MiB plt.savefig(plot_name, transparent=True)
39 36.2 MiB 0.0 MiB plt.clf()
40 36.2 MiB 0.0 MiB plt.cla()
41 36.2 MiB 0.0 MiB plt.close()
(该功能的其余部分不会增加内存使用量。)
记忆在savefig()
处递增,但是尽管我试图关闭这个数字的各种方式,它仍然没有被释放。
任何人都知道为什么close()
没有释放内存?
编辑:
我尝试了另一种方法。
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot( some arguments)
fig.savefig(filename)
plt.close('all')
del ax, fig
这也不会减少内存使用量。
编辑2:
从其他地方的答案(Create a figure that is reference counted)我尝试了以下内容:
from matplotlib.backends.backend_svg import FigureCanvas
from matplotlib.figure import Figure
fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot etc...
fig.savefig(file_name)
plt.close('all')
这似乎也不起作用。记忆仍然单调增加,并始终在函数的savefig
行。
答案 0 :(得分:1)
我遇到了同样的问题。环顾四周后,我找到了一个解决方案:你需要关闭无花果和所有窗户。
import matplotlib.pylab as plt
fig,ax = plt.subplots(1)
plt.plot(X, Y)
fig.savefig(img_name)
fig.clf()
plt.close()
在关闭情节和数字之后,我的记忆保持在一个或多或少的恒定水平。
您也可以使用以下方法关闭轴:
ax.cla()
答案 1 :(得分:0)
# Clear the current axes.
plt.cla()
# Clear the current figure.
plt.clf()
# Closes all the figure windows.
plt.close('all')
plt.close(fig)
gc.collect()
尝试在循环末尾添加这些行!它为我工作。 (用于子图)