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实现随机密码字典生成器示例
Apr 09 Python
python采用getopt解析命令行输入参数实例
Sep 30 Python
Python实现堆排序的方法详解
May 03 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
python对XML文件的操作实现代码
Mar 27 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
php5 and xml示例
2006/11/22 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
详解PHP队列的实现
2019/03/14 PHP
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
深入理解Django的中间件middleware
2018/03/14 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
管理学专业个人求职信范文
2013/12/13 职场文书
单位成立周年感言
2014/01/26 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
员工辞职信怎么写
2015/02/27 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python