python2执行程序内存溢出导致被killed的问题因果分析
問題來源:
執(zhí)行一段程序,對某個函數(shù)重復(fù)執(zhí)行,當(dāng)執(zhí)行到一半時,就顯示被killed,重復(fù)幾次均如此。為什么會這樣呢?
第一步、定位被killed的根本原圖;
? ? ? ?使用vi /var/log/messages查看日志。日志顯示,是由于內(nèi)存溢出導(dǎo)致的。
第二步、定位內(nèi)存溢出的原因:
在主要的函數(shù)的前面加入@profile,用于顯示每行代碼的內(nèi)存使用情況。
通過輸出顯示,該函數(shù)的內(nèi)存一直在增長。
第三、第一種假設(shè),會不會是某某變量沒有釋放導(dǎo)致內(nèi)存一直在增加。
深入分析發(fā)現(xiàn),并不存在這種情況。因為沒有使用到全局變量。
這個函數(shù)一進來,他的內(nèi)存就是上次執(zhí)行的最后使用內(nèi)存。能確定的是字典內(nèi)存肯定沒有釋放。
第四步、加入del與gc.collect命令釋放內(nèi)存
在函數(shù)內(nèi)部加入del與gc.collect命令仍然無法釋放內(nèi)存。其結(jié)果仍然是被killed;
使用profile可以發(fā)現(xiàn)內(nèi)存并沒有得到釋放,至少在運行的時候沒有立馬釋放。
第五步、尋找立馬釋放的方法
網(wǎng)卡搜索此方法有效,如下所示
del lst[:]
del lst
gc.collect
實驗中發(fā)現(xiàn)使用del lst[:]能立馬有效。
最終的結(jié)論就是要刪除真正儲存內(nèi)存的東西,才能真正釋放當(dāng)下釋放內(nèi)存。
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python2执行程序内存溢出导致被killed的问题因果分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AC自动机的使用案例
- 下一篇: dict格式转字符串两种方法的区别