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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
python通过索引遍历列表的方法
May 04 Python
Python基于有道实现英汉字典功能
Jul 25 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
python3.6的venv模块使用详解
Aug 01 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
如何学习Python time模块
Jun 03 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
基于mysql的论坛(6)
2006/10/09 PHP
理解php Hash函数,增强密码安全
2011/02/25 PHP
php学习笔记之面向对象
2014/11/08 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
老生常谈进程线程协程那些事儿
2017/07/24 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
函授自我鉴定范文
2014/02/06 职场文书
学校招生宣传广告词
2014/03/19 职场文书
青春无悔演讲稿
2014/05/08 职场文书
关于旅游的活动方案
2014/08/15 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Python上下文管理器Content Manager
2021/06/26 Python