python 内存监控工具

python 内存监控工具python2 7 在内存管理上相比 python3 还是有些坑的 其释放后的内存仍然保留在 python 的内存池中 不被系统所用 python 循环引用的变量不会被回收 这会导致程序越运行 占用的内存越大 我在跑 py faster rcnn 的 demo 时 基本上跑 2000 张图像 16g 内存就要爆了 于是尝试用 python 的内存监控工具来调试程序 找到不能膨胀的变量 然后 del 之 再手动回收内存 gc

python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用。python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大。我在跑py-faster-rcnn的demo时,基本上跑2000张图像,16g内存就要爆了。于是尝试用python的内存监控工具来调试程序,找到不能膨胀的变量,然后del之,再手动回收内存gc.collec()

下面是我用的两个内存监视工具,一个是按每行代码查看内存占用的工具memory_profiler,一个是查看占用内存前十位变量的工具guppy。

1. memory_profiler

首先是安装:

pip install -U memory_profiler

然后用profile修饰想要查看的函数名:如:

 @profile def my_func(): a = [1] * (10 6) b = [2] * (2 * 10 7) del b return a if __name__ == '__main__': my_func()

输出结果:

Line #    Mem usage Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 6)
     6    166.20 MB 152.59 MB       b = [2] * (2 * 10 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

memory_profiler功能强大,更多功能可以看官网这里

2. guppy

首先安装:

pip install guppy

然后import下

 from guppy import hpy hxx = hpy() heap = hxx.heap() byrcs = hxx.heap().byrcs;

在主程序下增加:

print(heap)

输出示例:

 Index Count % Size % Cumulative % Kind (class / dict of class) 0 10124 22  95  95 list 1 16056 34  2  96 str 2 9147 20  1  97 tuple 3 102 0  0  98 dict of module 4 287 1  0  98 dict of type 5 2426 5  0  98 types.CodeType 6 2364 5  0  99 function 7 287 1  0  99 type 8 169 0  0  99 dict (no owner) 9 123 0  0  99 dict of class

可以看到第一个list占了95%的内存,若print(heap)在主程序的循环中,可以查看每次循环后的变量内存占用情况。

输入以下命令,查看这个占内存最大的list中的数据类型:
byrcs[0].byid

最后测试后发现,test.pyget_im_blob等函数占用内存不断增大,每检测一副图像,该函数增加6-10MB内存开销。但奇怪的是用guppy查看前十个变量,并没有发现哪个变量有明显的内存增大迹象。于是猜测可能是每张图像推理后,推理的结果bbox,label,img等数据保存在了内存中,这样方便所有图像推理结束后,plt.show().于是修改程序,每张图像推理后,plt.show()一下。用memory_profiler发现内存不再继续增大,interesting!其实把plt.show()改成plt.close()也可以防止内存不断增大。具体原因肯定是python 的内存回收机制规则导致的。

总结

您可能感兴趣的文章:

  • Python获取Redis所有Key以及内容的方法
  • Python利用memory_profiler查看内存占用情况
  • 详解解决Python memory error的问题(四种解决方案)
  • 解决Python运行文件出现out of memory框的问题
  • python获取redis memory使用情况场景分析
知秋君
上一篇 2024-11-07 19:02
下一篇 2024-11-08 19:12

相关推荐