python内存监控工具memory_profiler和guppy的用法详解


Posted in Python onJuly 29, 2019

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 81944416 95 81944416 95 list
  1 16056 34 1325464 2 83269880 96 str
  2 9147 20 745616 1 84015496 97 tuple
  3 102 0 366480 0 84381976 98 dict of module
  4 287 1 313448 0 84695424 98 dict of type
  5 2426 5 310528 0 85005952 98 types.CodeType
  6 2364 5 283680 0 85289632 99 function
  7 287 1 256960 0 85546592 99 type
  8 169 0 192088 0 85738680 99 dict (no owner)
  9 123 0 142728 0 85881408 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内存监控工具memory_profiler和guppy的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
python动态加载包的方法小结
Apr 18 Python
Python队列的定义与使用方法示例
Jun 24 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
pandas 时间格式转换的实现
Jul 06 Python
代码实例讲解python3的编码问题
Jul 08 Python
Django实现分页显示效果
Oct 31 Python
Python 自由定制表格的实现示例
Mar 20 Python
django 装饰器 检测登录状态操作
Jul 02 Python
Python 多进程原理及实现
Dec 21 Python
Python 硬币兑换问题
Jul 29 #Python
django中使用Celery 布式任务队列过程详解
Jul 29 #Python
详解python中自定义超时异常的几种方法
Jul 29 #Python
Python 离线工作环境搭建的方法步骤
Jul 29 #Python
如何通过python的fabric包完成代码上传部署
Jul 29 #Python
Python八皇后问题解答过程详解
Jul 29 #Python
python 标准差计算的实现(std)
Jul 29 #Python
You might like
9段PHP实用功能的代码推荐
2014/10/14 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
10个经典的网页鼠标特效代码
2018/01/09 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python读取Excel实例详解
2018/08/17 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
详解Python3 基本数据类型
2019/04/19 Python
python判断是空的实例分享
2020/07/06 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
美国保健品专家:Life Extension
2018/05/04 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
创建文明学校实施方案
2014/03/11 职场文书
推普周活动总结
2014/08/28 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
计算机实训心得体会
2016/01/14 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
详解如何用Python实现感知器算法
2021/06/18 Python
基于redis+lua进行限流的方法
2022/07/23 Redis