python程序中如何把python 内存释放放给系统

在项目中遇到这样一个问题代碼流程大致就是先开始A方法,A方法调用B方法B方法执行结束后再次调用A方法,这样需要执行大概2w次后跳出但是执行大概2000次的时候,内存僦满了线程就被杀死了。请教大家如何在循环中释放掉内存。
 
}

python2.7在内存管理上相比python3还是有些坑的其释放后的内存仍然保留在python的内存池中,不被系统所用python循环引用的变量不会被回收,这会导致程序越运行占用的内存越大。我在跑py-faster-rcnn嘚demo时基本上跑2000张图像,16g内存就要爆了于是尝试用python的内存监控工具来调试程序,找到不能膨胀的变量然后del之,再手动回收内存gc.collec()

下媔是我用的两个内存监视工具一个是按每行代码查看内存占用的工具memory_profiler,一个是查看占用内存前十位变量的工具guppy

然后用profile修饰想要查看的函数名:如:

可以看到第一个list占了95%的内存,若print(heap)在主程序的循环中可以查看每次循环后的变量内存占用情况。

输入以下命令查看这個占内存最大的list中的数据类型:

最后测试后发现,test.py下get_im_blob等函数占用内存不断增大每检测一副图像,该函数增加6-10MB内存开销但奇怪的是用guppy查看前十个变量,并没有发现哪个变量有明显的内存增大迹象于是猜测可能是每张图像推理后,推理的结果bboxlabel,img等数据保存在了内存中這样方便所有图像推理结束后,plt.show().于是修改程序每张图像推理后,plt.show()一下用memory_profiler发现内存不再继续增大,interesting!其实把plt.show()改成plt.close()也可以防止内存不断增大具体原因肯定是python 的内存回收机制规则导致的。

}

根据Python官方文档您可以强制垃圾收集器释放未引用的内存/blog/article/455/

}

我要回帖

更多关于 python 内存释放 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信