Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何清除绘图以避免内存泄漏?_Python_Matplotlib_Plot - Fatal编程技术网

Python 如何清除绘图以避免内存泄漏?

Python 如何清除绘图以避免内存泄漏?,python,matplotlib,plot,Python,Matplotlib,Plot,我正在绘制大量的图形网格,我得到警告: /home/michael/miniconda2/envs/pt/lib/python3.6/site packages/matplotlib/pyplot.py:537: 运行时警告:已打开20多个数字。创造的数字 通过pyplot接口,matplotlib.pyplot.figure被保留 直到显式关闭,可能会消耗太多内存。控制 有关此警告,请参阅rcParam`figure.max_open_警告 更重要的是,我有内存泄漏。我应该如何正确地清除图以消

我正在绘制大量的图形网格,我得到警告:

/home/michael/miniconda2/envs/pt/lib/python3.6/site packages/matplotlib/pyplot.py:537: 运行时警告:已打开20多个数字。创造的数字 通过pyplot接口,matplotlib.pyplot.figure被保留 直到显式关闭,可能会消耗太多内存。控制 有关此警告,请参阅rcParam`figure.max_open_警告

更重要的是,我有内存泄漏。我应该如何正确地清除图以消除泄漏

def place_fig(values, rows=1, columns=1, r=0, c=0, label='test'):
    ax = plt.subplot2grid((rows, columns), (r, c))
    ax.hist(values, label=label)
    plt.legend(loc='upper right')
    ax.legend(loc='upper right')


def plot_grid(arrays, path=None, filename=''):
    plt.figure()
    for c in range(5):
        for array, r in zip(arrays[c], range(5)):
            place_fig(array, rows=5, columns=5, r=r, c=c)
    plt.savefig(path + filename)
    plt.clf()


def plot_layers(path=None, i=0, values_3d=None):

    array1 = []
    array2 = []
    array3 = []
    array4 = []
    array5 = []

    array_list = [array1, array2, array3, array4, array5]

    for j in range(5):
        for array, values in zip(array_list, values_3d[j]):
            array.append(values)

    plot_grid([array1, array2, array3, array4, array5], path=path, filename='iter_{:d}'.format(i))


for i in range(1000):
    values_3d = np.random.randn(5, 5, 10000)
    plot_layers(path='plots/', i=i, values_3d=values_3d)
您需要决定:

是否要创建一个图形plt.figure调用一次,然后清除该图形:plt.clf 是否要在每个步骤中创建新地物plt.figure称为每个步骤,然后关闭地物。plt.close
目前,您正在执行一半/一半的操作,因此所有图形都将保持打开状态并充满内存。

在这种情况下matplotlib.pyplot.closefig不起作用吗?对不起,我不太明白你的意思。plot_grid生成图形直方图网格,并将其保存为单个图像。这种情况发生了1000次。我想我对matplotlib中的“数字”感到困惑。您能解释一下您提到的两个选项之间的区别吗?图形是在plt.show上显示的对象或在plt.savefig上保存的对象。你创建了1000个这样的对象,在你不再需要它们之后,你再也不会从内存中删除它们。就像一张纸。选项1将是一张单张纸;每次画画后,你都会删除它的内容,并在上面画一些新的东西。选项2是为每张图纸制作一张新的图纸;但之后一定要把它扔进垃圾箱。在这两种情况下,你的办公桌上都没有1000张纸。哦,我明白了,谢谢!是否可以修改我使用选项1的代码,以便基本上创建一个图形,绘制绘图,保存图形,使用clf清除绘图,然后在同一图形中绘制其他绘图,保存此修改的图形,再次清除绘图,等等?我想我的问题是-我可以在plot_layers函数中创建图形吗,然后将其作为参数传递给plot_grid函数,并在保存后在plot_grid中将其清除?绝对。看起来您只需要将plt.figure行移动到该函数,但是如果没有可运行的代码,我当然不能100%确定。