python内存监控工具memory_profiler和guppy的用法详解

发布时间:2020-08-21 19:44:58

来源:脚本之家

阅读:123

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.py下get_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内存监控工具memory_profiler和guppy的用法详解相关推荐

  1. python 内存分析工具_python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

  2. python定义栈_Python开发中栈的定义及用法详解

    前言 在Python开发中栈的设计和使用是常用到的,可以说是学习Python必须要掌握的一个技能,那么作为程序猿的你掌握了多少呢?掌握不熟练?没关系,跟着小编再来学习一下吧. 正文 栈是常用的数据结构 ...

  3. python中global和def_Python中 Global和Nonlocal的用法详解

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  4. python内存监控工具memory_profiler和guppy的用法

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

  5. python 元组拆包_Python元组拆包和具名元组解析实例详解

    前言 在Python中元组是一个相较于其他语言比较特别的一个内置序列类型.有些python入门教程把元组成为"不可变的列表",这种说法是不完备的,其并没有完整的概括元组的特点.除了 ...

  6. python sqlsever 时间_Python sqlalchemy时间戳及密码管理实现代码详解

    一.时间戳 实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下: from sqlalchemy.sql imp ...

  7. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

  8. python比例图_python在地图上画比例的实例详解

    现在用python画图已经难不倒一直跟小编学习的小伙伴们了,甚至有的小伙伴画图比小编还要厉害.为此小编还偷偷下了一番功夫,画图这种事情,细节上的完善肯定能让图片更加好看.所以小编知道大家会画地图,但是 ...

  9. python hook 微信_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

最新文章

  1. 安装vim-go插件之后遇到的gopls警告信息不消失的问题的解决方法
  2. 计算机审计中级培训结业考试,第二期计算机审计中级培训班结业考.doc
  3. 深入对比数据科学工具箱:Python和R的异常处理机制
  4. sodu 命令场景分析
  5. 实现threadlocal_ThreadLocal如何实现?
  6. iOS关于armv7,armv7s,arm64,i386,x86_64等问题
  7. 云服务器虚拟主机区别,云服务器和虚拟主机的区别
  8. rowdata java_Java RowDataUtil.addRowData方法代碼示例
  9. SpringMvc创建maven工程过慢问题解决方案
  10. laravel下载php7.2,【laravel7.x中文文档】安装
  11. 如何在计算机设置鼠标宏,鼠标宏怎么设置,教您鼠标如何设置宏
  12. 主页被修改成httpwww.yy4000.cn等类似首页,无法更改,怎么办?
  13. 5V降压1.5V的几款极大电流IC,超简单的LDO芯片
  14. python分析出nba球员的位置_【圆老司】用python展示NBA球员出手位置偏好
  15. 【蓝桥杯 路径 python】Dij算法
  16. 空调变频和定频的区别?
  17. 不得不承认、放弃造车是明智之举!
  18. 【k8s】三、k8s集群的初始化
  19. win 7系统(64位)安装包
  20. 设置Visual Studio颜色主题

热门文章

  1. C#:安装Windows服务,动态指定服务名及描述
  2. 截取数组中的第i个元素,并返回截取后的结果
  3. AngularJS国际化配置
  4. hdu5334(2015多校4)--Virtual Participation(构造)
  5. PHP两个日期之间的所有日期
  6. CentOS6.5下的Nagios安装配置详解(图文)
  7. servlet实现新闻控制
  8. char* 与 LPCTSTR转换
  9. 利用ResultFilter实现asp.net mvc 页面静态化
  10. 字符转换工具,仿牛族字符转换