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.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的用法详解,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/meccaendless/article/details/79701726

标签:python,内存监控工具,memory,profiler,guppy
0
投稿

猜你喜欢

  • MySQL数据库之UPDATE更新语句精解

    2009-03-20 15:21:00
  • Python线程下使用锁的技巧分享

    2023-10-03 06:05:42
  • Python中用于去除空格的三个函数的使用小结

    2022-02-07 23:43:45
  • Python matplotlib学习笔记之坐标轴范围

    2022-04-21 16:24:28
  • HTML+CSS 模仿Windows 7 桌面效果

    2010-06-17 14:33:00
  • MySQL中使用表别名与字段别名的基本教程

    2024-01-12 19:39:15
  • 在 CentOS 7 中安装 MySQL 8 的教程详解

    2024-01-17 03:33:56
  • 人性化网页设计技巧

    2007-10-15 13:02:00
  • python爱心表白 每天都是浪漫七夕!

    2023-02-26 20:36:55
  • SQL语句学习

    2024-01-18 15:07:00
  • Vue watch原理源码层深入讲解

    2024-04-30 10:40:58
  • php之二维数组排序问题

    2023-07-15 06:44:42
  • Python利用openpyxl库遍历Sheet的实例

    2023-10-20 20:19:01
  • 使用C#连接并读取MongoDB数据库

    2024-01-15 17:12:13
  • Python unittest模块用法实例分析

    2023-03-28 17:36:06
  • 账户名和密码漏输或误输的文字提示

    2009-06-24 14:28:00
  • Python Django基础二之URL路由系统

    2021-05-12 11:50:07
  • PyTorch模型转TensorRT是怎么实现的?

    2021-09-01 08:14:02
  • Python中__repr__和__str__区别详解

    2022-02-17 04:45:25
  • python抓取网页中链接的静态图片

    2023-04-17 04:27:27
  • asp之家 网络编程 m.aspxhome.com