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 相关文章推荐
Python3实现从指定路径查找文件的方法
May 22 Python
深入探究Django中的Session与Cookie
Jul 30 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python格式化日期时间操作示例
Jun 28 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
python重试装饰器的简单实现方法
Jan 31 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
python判断链表是否有环的实例代码
Jan 31 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
如何理解及使用Python闭包
Jun 01 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
模仿OSO的论坛(二)
2006/10/09 PHP
一个MYSQL操作类
2006/11/16 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
浅析PHP开发规范
2018/02/05 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python解析xml文件实例分析
2015/05/27 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
汽车驾驶求职信
2013/10/25 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
电子信息工程自荐信
2014/05/26 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
化验室岗位职责
2015/02/14 职场文书
员工家属慰问信
2015/03/24 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL