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 相关文章推荐
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
简单介绍Python中的decode()方法的使用
May 18 Python
Python实现建立SSH连接的方法
Jun 03 Python
Python并行分布式框架Celery详解
Oct 15 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
Python 的AES加密与解密实现
Jul 09 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
python中前缀运算符 *和 **的用法示例详解
May 28 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
python 写一个水果忍者游戏
Jan 13 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
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
Vue的MVVM实现方法
2017/08/16 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
python3中int(整型)的使用教程
2017/03/23 Python
python如何爬取个性签名
2018/06/19 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python之时间和日期使用小结
2019/02/14 Python
基于树莓派的语音对话机器人
2019/06/17 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
总经理任命书范本
2014/06/05 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
优秀团支部申报材料
2014/12/26 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
党员证明模板
2015/06/19 职场文书