python内存监控工具memory_profiler和孔雀鱼的用法详解

  

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> plt.show()。于是修改程序,每张图像推理后,<代码> plt.show() 一下。用<代码> memory_profiler> plt.show() 改成<代码> plt.close()也>   

  

  

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

python内存监控工具memory_profiler和孔雀鱼的用法详解