python内存监控工具memory_profiler和guppy的用法详解
作者:一江明澈的水 发布时间:2023-02-17 01:15:18
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的用法详解,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/meccaendless/article/details/79701726
猜你喜欢
- 前言大家在使用pymysql的时候,通过fetchall()或fetchone()可以获得查询结果,但这个返回数据是不包含字段信息的(不如p
- 1.global关键字默认情况下,在局部作用域对全局变量只能进行:读取,修改内部元素(可变类型),无法对全局变量进行重新赋值读取:CITY=
- 各位大家好!很荣幸能在这里和大家聊聊!(*^__^*) 嘻嘻……此处省略488字,切入正题。关于网页设计这个行业,在中国来讲这个行业并不成熟
- 一、PEP 8规范官方文档:https://legacy.python.org/dev/peps/pep-0008/中文翻译: https:
- 一:数据源介绍本篇文章介绍的是使用python实现对葵花8号卫星数据进行自动下载。葵花8号卫星是日本的一颗静止轨道气象卫星,覆盖范围为60S
- 一、切片切片:指对操作的对象截取其中一部分的操作,字符串、列表、元组都支持切片操作语法:序列[开始位置下标:结束位置下标:步长] ,不包含结
- 隐藏并修改文件的最后修改时间的asp-webshell。源码:<% '隐藏并修改文件的最后修改时间的aspshell '
- golang sort package: https://studygolang.com/articles/3360sort 操作的对象通常
- PDOStatement::getAttributePDOStatement::getAttribute — 检索一个语句属性(PHP 5
- 一些大型站点都有着非常一流的视觉外观,它们很可能在设计时使用了网格系统。网格可以是页面布局显得紧凑而且稳定,为设计师在设计站点时提供一个逻辑
- 最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。Prim算法过程
- 首先给出展示结果,大体就是检测工业板子是否出现。采取检测的方法比较简单,用的OpenCV的模板检测。大体思路opencv读取视频将视频分割为
- 一.文件基本操作1.1 文件打开和关闭open(‘文件名称','打开模式')模式:r(只读,指针再头) w(只写,存
- 这里我不讨论 python 的一些有用的库或者框架,只从语言本身,最小支持的情况下谈论这门语言本身。语言的发展都是越来越接近Lisp,这也是
- 通过@classmethod 实现多态1.概述python中通常使用对象创建多态模式,python还支持类创建多态模式。下面通过一个例子展示
- (一)Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Pyth
- 如下所示:#!/usr/bin/env python3# -*- coding: utf-8 -*-import sqlite3conn =
- XML的嵌套处理 一般情况下,我们从数据库中查询得到的结果集可能很大,所以从服务器返回到客户端时,数据会被分成若干个页面分别进行传递。此时,
- 这篇文章主要介绍了python matplotlib饼状图参数及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 目录前言cv2.drawMarker()函数说明参数说明利用鼠标回调函数交互式画点例1,简单的例子例2,删除功能总结前言这里所谓画点的意思是