解决matplotlib导致内存泄漏问题

同样的深度学习模型在linux运行没有遇到内存泄漏的问题,迁移到Windows就出现了问题。

报错信息为:numpy.core._exceptions.memoryerror unable to allocate
查了一下GPU Memory使用量没有爆(爆也不是提示这个信息),使用率正常。开始查问题是不是出在CPU上。

观察发现随着代码的运行时长增加,CPU内存占用在持续地缓缓地上涨,内存占满时,则报错程序停止。
解决matplotlib导致内存泄漏问题_第1张图片设置断点进行观察,发现深度学习模型部分并不会造成内存的增加,引起内存上升的部分存在于对模型输出结果的后处理部分。再进一步定位发现问题存在于调用matplotlib进行结果图绘制和存图的部分。网上查了一下,有不少关于matplotlib引起内存泄漏的问题。主要时因为图像绘制大量占用内存但没有得到及时的释放,导致逐渐累积最终内存爆炸。

解决方案如下所示:(参考博文:https://www.codenong.com/7101404/)

  1. 在不需要展示图片时,使用matplotlib 的非交互模式,如 agg;
  2. 图像保存后及时清理内存

代码参考:

import matplotlib
matplotlib.use('Agg') 
import matplotlib.pyplot as plt
import numpy as np      
import gc

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.clf()
plt.close()
del a, b
gc.collect()

参考博文中提到:

  • .clf(): 解决循环绘制时,Matplotlib内存不足
  • close(): 解决指定图形大小时未释放内存

改进之后,代码运行时CPU内存占用约从3.6GB上升至6.3GB,之后稳定在6.3GB,内存爆炸问题解决。
解决matplotlib导致内存泄漏问题_第2张图片

你可能感兴趣的:(实用工具,python,内存泄漏,matplotlib)