近期在改一个需求,需要绘制大量的图片,起初,用的之前的代码,因为之前虽然也是循环绘制,但是不论是数据量还是图的数量,都没有很大,然后导致我用老的代码做现在的功能时出现爆内存现象,第一次中途退出了我还不知道是怎么回事,但是第二次,我无意中打开了任务管理器,发现内存占用已经到了96%如下图

matplotlib循环绘图时如何节省内存-LMLPHP

 可以看到,python进程内存占用已经到了惊人的10G,估计已经把其它进程全部挤到硬盘里了,内存里只剩下python了,我没多想肯定是绘图导致的,并且我大概能想到应该是每次绘制完图,内存没有释放,于是搜了下怎么释放已绘制完图像的内存,找到了如下代码(百度搜索现在只要是开发相关问题,都是文心一言回答,实时生成代码,并且准确度还可以,点个赞)

import matplotlib.pyplot as plt
 
# 创建一个更小的画布
fig, ax = plt.subplots(figsize=(4, 4))  # 设置画布大小
ax.plot([1, 2, 3], [4, 5, 6])  # 画一个简单的图形
 
# 保存为PNG格式,可以减少内存占用
fig.savefig('example.png', dpi=100)  # dpi设置为100,这对内存占用影响较小
 
# 如果需要,可以关闭画布释放内存
plt.close(fig)

其实最关键的就是最后一步,使用plt.close(fig)释放画布的内存,如果是使用df画的,可以先获取到画布对象,然后close,比如

ax = df.plot.line()
fig = ax.get_figure()
plt.close()

加上内存释放代码之后,内存立马降下来了,因为我每次循环只创建一个图,改进后的绘图内存占用几乎可以忽略不计。

04-28 19:53