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

时间:2018-12-02 19:11:57

标签: 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_warning)。

更重要的是,我遇到了内存泄漏。我应该如何正确清除地块以消除这种泄漏?

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)

1 个答案:

答案 0 :(得分:0)

您需要决定:

  • 您是否要创建一个单一的图形(一次调用plt.figure(),然后创建clear该图形:plt.clf()
  • 是否要在每个步骤中创建一个新图形(plt.figure()被称为每个步骤),然后在close中创建图形。 plt.close()

(当前,您正在做一半/一半,因此所有数字将保持打开状态并充斥内存。)