python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大。我在跑<代码> py-faster-rcnn的演示代码>时,基本上跑2000张图像,16 g内存就要爆了。于是尝试用python的内存监控工具来调试程序,找到不能膨胀的变量,然后▽之,再手动回收内存gc.collec ()
下面是我用的两个内存监视工具,一个是按每行代码查看内存占用的工具memory_profiler,一个是查看占用内存前十位变量的工具孔雀鱼。
首先是安装:
<代码> pip安装- u memory_profiler 代码>
然后用轮廓修饰想要查看的函数名:如:
@profile def my_func (): 一个=[1]* (10 * * 6) b=[2] * (2 * 10 * * 7) 德尔b 返回一个 if __name__==癬_main__”: my_func ()
输出结果:
#线,,,Mem usage Increment ,行内容
引用>
==============================================
,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,@profile
,,,,4,,,,,5.97 MB ,,0.00 MB ,def my_func ():
,,,,5,,,,13.61 MB ,,7.64 MB ,,,,,一个=[1]* (10 * * 6)
,,,,6,,,166.20 MB 152.59 MB ,,,,,b=[2] * (2 * 10 * * 7)
,,,,7,,,,13.61 MB -152.59 MB ,,,,,德尔b
,,,,8日,,,,13.61 MB ,,0.00 MB ,,,,,返回一个memory_profiler功能强大,更多功能可以看官网这里
首先安装:
<代码> pip安装孔雀鱼代码>
然后导入下
从古比鱼进口hpy hxx=hpy () 堆=hxx.heap () byrcs=hxx.heap () .byrcs;在主程序下增加:
<代码>打印(堆)代码>
输出示例:
指数计算%大小%累积%(类/dict类) 0 10124 22 81944416 95 81944416 95 1 16056 34 1325464 2 1325464 96 str 2 9147 745616 1 84015496 97元组 3 0 84381976 98 102 0 366480 dict类型模块 4 287 98 313448 0 84695424 dict类型 5 2426 98 310528 0 85005952 types.CodeType 6 2364 99 283680 0 85289632的功能 99 287 256960 0 85546592类型 99 169 192088 0 85738680 dict(没有所有者) 9 0 85881408 99 123 0 142728 dict类可以看到第一个列表占了95%的内存,若<代码>打印(堆)代码>在主程序的循环中,可以查看每次循环后的变量内存占用情况。
输入以下命令,查看这个占内存最大的列表中的数据类型:
<代码> byrcs [0] .byid 代码>最后测试后发现,<代码> test.py> 代码下<代码> get_im_blob> 代码等函数占用内存不断增大,每检测一副图像,该函数增加6-10MB内存开销。但奇怪的是用古比鱼查看前十个变量,并没有发现哪个变量有明显的内存增大迹象。于是猜测可能是每张图像推理后,推理的结果bbox,标签,img等数据保存在了内存中,这样方便所有图像推理结束后,<代码> plt.show()。代码>于是修改程序,每张图像推理后,<代码> plt.show() 代码>一下。用<代码> memory_profiler> 代码发现内存不再继续增大,有趣!其实把<代码> plt.show() 代码>改成<代码> plt.close()也> 代码可以防止内存不断增大。具体原因肯定是python的内存回收机制规则导致的。
以上所述是小编给大家介绍的python内存监控工具memory_profiler和孔雀鱼的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!python内存监控工具memory_profiler和孔雀鱼的用法详解