我有数据分析模块,其中包含多次调用Matplotlib pyplot API的函数,每次运行时最多可生成30个数字。这些数字在生成后会立即写入磁盘,因此我需要从内存中清除它们。目前,在我的每个职能结束时,我都
import matplotlib.pyplot as plt
plt.clf()
然而,我不太确定这个陈述是否能真正清除记忆。我特别担心,因为我看到每次运行模块进行调试时,我的可用内存空间不断减少。在我将这些图表写入磁盘后,每次都可以告诉我我需要做些什么才能真正清理我的记忆?
谢谢。
答案 0 :(得分:1)
特别是在运行多个进程或线程时,最好定义图形变量并直接使用它:
from matplotlib import pyplot as plt
f = plt.figure()
f.clear()
plt.close(f)
无论如何,您必须结合使用plt.clear()和plt.close()
答案 1 :(得分:0)
我有一个数据分析模块,其中包含多个调用Matplotlib pyplot API的函数
您可以编辑调用matplotlib的函数吗?我遇到了同样的问题,我尝试遵循以下命令,但没有一个起作用。
plt.close(fig)
fig.clf()
gc.collect()
%reset_selective -f fig
然后有一个窍门对我有用,而不是每次都创建一个新图形,而是将相同的fig对象传递给该函数,这解决了我的问题。
例如使用
fig = plt.figure()
for i in range(100):
plt.plot(x,y)
而不是
for i in range(100):
fig = plt.figure()
plt.plot(x,y)
答案 2 :(得分:0)
最新答案,但这对我有用。我有一个很长的顺序代码,可以生成许多图,并且到该过程结束时,它总是会耗尽所有RAM。 我没有像在每个图形完成后调用fig.close()那样,而是简单地重新定义了plt.figure函数,如下所示,它是自动完成的:
import matplotlib.pyplot as plt
import copy
try:
# if script it run multiple times, only redefine once
plt.old_figure
except:
# matplotlib is imported for the first time --> redefine
plt.old_figure = copy.deepcopy(plt.figure)
def newfig(*args):
plt.show()
plt.close("all")
return plt.old_figure(*args)
plt.figure = newfig
我很清楚这不是一个很好的解决方案,但是它简单,快捷,并且为我成功了!也许有一种方法可以装饰plt.figure而不是重新定义它。
答案 3 :(得分:0)
经过一周的试用,我得到了解决方案!希望它可以帮助你。 附上我的演示。
import matplotlib.pyplot as plt
import numpy as np
A = np.arange(1,5)
B = A**2
cnt=0
while(1):
cnt = cnt+1
print("########### test %d ###########" % cnt)
# here is the trick:
# set the figure a 'num' to prevent from re-malloc of a figure in the next loop
# and set "clear=True" to make the figure clear
# I never use plt.close() to kill the figure, because I found it doesn't work.
# Only one figure is allocated, which can be self-released when the program quits.
# Before: 6000 times calling of plt.figure() ~ about 1.6GB of memory leak
# Now: the memory keeps in a stable level
fig = plt.figure(num=1, clear=True)
ax = fig.add_subplot()
# alternatively use an other function in one line
# fig, ax = plt.subplots(num=1,clear=True)
ax.plot(A,B)
ax.plot(B,A)
# Here add the functions you need
# plt.show()
fig.savefig('%d.png' % cnt)