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发送arp欺骗攻击代码分析
Jan 16 Python
python文件操作整理汇总
Oct 21 Python
Django中使用locals()函数的技巧
Jul 16 Python
python模块之time模块(实例讲解)
Sep 13 Python
python中Apriori算法实现讲解
Dec 10 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
python logging.info在终端没输出的解决
May 12 Python
python实现简单的名片管理系统
Apr 26 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
咖啡的传说和历史
2021/03/03 新手入门
PHP 反向排序和随机排序代码
2010/06/30 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
jquery自定义表格样式
2015/11/23 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python打开网页和暂停实例
2014/09/30 Python
Python 12306抢火车票脚本
2018/02/07 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
详解python itertools功能
2020/02/07 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
枚举与#define宏的区别
2014/04/30 面试题
优秀中专生推荐信
2013/11/17 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
高中生军训感言
2015/08/01 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
浅谈Redis缓冲区机制
2022/06/05 Redis