如果你的程序沒有調用什么特殊的庫,
只是用了很平常的庫,
而且使再循環很多的情況下,
那么建議你把循環里的程序拆出來,寫成一子函數,循環子函數。
如下面格式:
for (循環)
子函數
這樣程序每次循環的是子函數然后循環完子函數程序會自動搜集所有的子函數變量,
這樣保證了每次循環的殘留最小。
如果還是不行,下面是我搜集的一些資料。
python升級到2.7.13
函數執行的結尾加上這個即可
for x in locals().keys():
del locals()[x]
gc.collect()
原理是,locals()會列出當前所有局部變量,手動的把當前函數生成的開銷都給清空掉即可釋放掉內存。
---------------------
作者:田有權
來源:CSDN
原文:https://blog.csdn.net/u011060852/article/details/78183373
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
https://blog.csdn.net/nirendao/article/details/44426201/
以上說明,當調用del時,其實Python並不會真正release內存,而是將其繼續放在其內存池中;只有在顯式調用gc.collect()時,才會真正release內存。
del locals()[x]
gc.collect()
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
https://blog.csdn.net/kelindame/article/details/73008487
第一分析無果,然后當時沒想到什么方法。只能暴力,注釋一部分代碼進行排查。發現注釋掉將消息發送給業務服務的代碼,內存不會持續增長。
懷疑是不是requests庫的問題。然后進行google:requests memory leak,發現還真有這個問題。地址:https://github.com/requests/requests/issues/1685
他們的討論非常精彩。不過上面的討論是在pypy下,requests出現內存泄露。而我用的Cpython。而且后面的pypy版本也已經修復了這個bug。不過當時不信邪,
還是認為requests庫有問題,所以改換成python3的urllib去發送信息,發現結果還是一樣。然后網上一查,特么requests底層是封裝url庫的。已哭暈在廁所。
你的代碼里三層循環,有將近10^9個元素,放不下就報這個錯了.
項目中兩種情況導致對象沒有被正確回收:
被退出才回收的對象引用
交叉引用
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
http://blog.sina.com.cn/s/blog_a046022d0101esu2.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days_1.html
https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days_1.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
安裝memory_profiler庫
https://www.cnblogs.com/kaituorensheng/p/5669861.html