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文件和目录操作详解
Feb 08 Python
python实现2048小游戏
Mar 30 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
python 元组的使用方法
Jun 09 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
Python实现k-means算法
2018/02/23 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
园长自我鉴定
2013/10/06 职场文书
大学生村官演讲稿
2014/04/25 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
校长个人总结
2015/03/03 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android