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

20

我有一段代码,循环一两次没问题,但最终会占用更多内存。我尝试使用memory_profiler查找内存泄露,以下是结果:

row_nr    Memory_usage    Memory_diff    row_text
 470     52.699 MiB     0.000 MiB      ax.axis('off')
 471     167.504 MiB    114.805 MiB    fig.savefig('figname.png', dpi=600)
 472     167.504 MiB    0.000 MiB      fig.clf()
 473     109.711 MiB    -57.793 MiB    plt.close()
 474     109.711 MiB    0.000 MiB      gc.collect()`

我是这样创建图形的:

fig, ax = plt.subplots()

你有什么建议,109 - 52 = 57 MiB 去哪了?

我正在使用Python 3.3。


可能是 https://dev59.com/YGw05IYBdhLWcg3wnjPC 的重复问题。虽然那只是一个解决方法,而不是这个问题的明确解决方案。 - rth
这个问题比较通用,可能其中一个场景适用于您的情况。如果不是,请告诉我们更多关于使用案例的细节。https://dev59.com/c2w05IYBdhLWcg3wqzms. - J Richard Snape
谢谢尝试,不幸的是它没有起作用,我没有在django中运行任何东西,所以那并没有帮助。我可以尝试使用多进程,但正如所述,这只是避免了问题,而没有解决它。我正在使用子图("fig,ax = plt.subplots()"),所以我不能从fig = plt.figure()更改为fig = figure.Figure(),或者有其他建议吗? - axel_ande
在每个循环的结尾处尝试使用 plt.close('all')。对于 agg 后端,这对我很有效。 - komodovaran_
5个回答

16

我尝试了这里发布的所有方法都无法解决我的问题。在我的情况下,这似乎与通过SSH解释器在服务器上运行有关。显然,这将使用非交互模式,然后开始像通常一样清除所有内存:

import matplotlib
matplotlib.use('Agg')

来源:https://matplotlib.org/stable/faq/howto_faq.html#work-with-threads


5
这个答案应该被接受。这是matplotlib中已知的一个bug https://github.com/matplotlib/matplotlib/issues/20300 - Jongsu Liam Kim
2
这将RAM使用量从GB降至MB。谢谢!正如您所说,其他帖子对我都没有用。 - Alperen
3
在我的情况下,这与SSH无关,我是在本地运行一个Python脚本(保存图像)。 - Alperen
同时从Python和Eclipse运行,从运行结束时的30GB降至稳定的100MB。尝试了其他所有方法都无效。 - twilsonco
非常感谢!不确定这是否是一个错误,但它一直让我发疯。设置后端解决了问题。其他方法都没有起作用。此外,在我的情况下,这是一个本地的Python脚本,与SSH无关。 - Stefan Shi

10
# Clear the current axes.
plt.cla() 
# Clear the current figure.
plt.clf() 
# Closes all the figure windows.
plt.close('all')
希望这可以帮助你

4
请添加import gc; gc.collect()以确保清除内存! - Raven

6

4
在笔记本上,plt.ioff() 对我有用,否则使用 plt.close(fig)

2
# 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()

这对我很有帮助。只需将这些行放在循环的末尾即可!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接