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版
Dec 07 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
对Python信号处理模块signal详解
Jan 09 Python
Python中常用的内置方法
Jan 28 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
教你怎么用Python实现多路径迷宫
Apr 29 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
简单采集了yahoo的一些数据
2007/02/14 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php简单的上传类分享
2016/05/15 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
Python序列化pickle模块使用详解
2020/03/05 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
酒店应聘自荐信
2013/11/09 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
班主任个人工作反思
2014/04/28 职场文书
督导岗位职责范本
2015/04/10 职场文书
教师教育心得体会
2016/01/19 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android