close()在matplotlib savefig之后不释放内存

时间:2017-10-25 13:06:31

标签: python matplotlib memory

我正在运行一个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行。

2 个答案:

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

尝试在循环末尾添加这些行!它为我工作。 (用于子图)