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

陈默
陈默
发布时间:2026-10-13 | 4人浏览过
原创

本文详解Python中两款内存监控工具memory_profiler和guppy的使用。针对Python2.7内存池机制导致的内存膨胀问题,通过逐行监控和变量占比分析,定位并解决py-faster-rcnn中图像推理时的内存持续增长现象,提供具体的代码修改建议。

Python内存管理问题与监控工具介绍

Python 2.7在内存管理上相比Python 3仍存在局限,其释放后的内存往往保留在Python的内存池中,不再归还给操作系统。此外,Python中循环引用的变量无法被自动回收,这会导致程序运行时间越长,占用的内存越大。在运行py-faster-rcnn的demo时,处理大约2000张图像后,16GB内存即被耗尽。为此,我尝试使用Python的内存监控工具来调试程序,定位那些无法自动释放的变量,通过del语句手动删除,并调用gc.collect()进行内存回收。

以下是我使用的两款内存监控工具:memory_profiler用于按代码行查看内存占用情况,guppy用于查看占用内存前十位的变量详情。

memory_profiler逐行内存监控

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功能强大,更多高级用法可参考其官方网站。

guppy变量内存占比分析

2. guppy

首先安装该库:

pip install guppy

然后在代码中导入模块:


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

实战案例:py-faster-rcnn内存泄漏排查与修复

经过最后测试发现,在test.py中,get_im_blob等函数占用的内存不断增大,每检测一副图像,该函数增加6-10MB的内存开销。但奇怪的是,使用guppy查看前十个变量时,并未发现哪个变量有明显的内存增大迹象。于是猜测可能是每张图像推理后,推理结果如bbox、label、img等数据被保存在了内存中,以便所有图像推理结束后,plt.show().。因此修改程序,在每张图像推理后,显式调用plt.show()。再次使用memory_profiler监测发现内存不再继续增大,这很有趣!其实将plt.show()改为plt.close()也也可以防止内存不断增大。具体原因可能与Python的内存回收机制规则有关。

总结

以上所述是小编给大家介绍的python内存监控工具memory_profiler和guppy的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表