如何完全清除所有Matplotlib图的记忆

时间:2015-02-27 04:07:22

标签: python memory matplotlib

我有数据分析模块,其中包含多次调用Matplotlib pyplot API的函数,每次运行时最多可生成30个数字。这些数字在生成后会立即写入磁盘,因此我需要从内存中清除它们。目前,在我的每个职能结束时,我都

import matplotlib.pyplot as plt

plt.clf()

然而,我不太确定这个陈述是否能真正清除记忆。我特别担心,因为我看到每次运行模块进行调试时,我的可用内存空间不断减少。在我将这些图表写入磁盘后,每次都可以告诉我我需要做些什么才能真正清理我的记忆?

谢谢。

4 个答案:

答案 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)