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中random模块生成随机数详解
Mar 10 Python
Python中单、双下划线的区别总结
Dec 01 Python
Python subprocess模块常见用法分析
Jun 12 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
python小程序实现刷票功能详解
Jul 17 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
详解python中*号的用法
Oct 21 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
python函数调用,循环,列表复制实例
May 03 Python
pycharm2020.2 配置使用的方法详解
Sep 16 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创建PDF中文文档
2006/10/09 PHP
PHP的栏目导航程序
2006/10/09 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
单链表反转python实现代码示例
2018/02/08 Python
详解Python传入参数的几种方法
2019/05/16 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
python实现udp传输图片功能
2020/03/20 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
python 制作网站小说下载器
2021/02/20 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
图书馆志愿者活动总结
2014/06/27 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书