您好,登錄后才能下訂單哦!
本篇文章為大家展示了Python 程序的內(nèi)存泄露該怎么解決,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
如果大家在 Linux 或者 macOS 下面運行一段可能導(dǎo)致內(nèi)存泄露的程序,那么你可能會看到下面這樣的情況:
而如果你用的系統(tǒng)是 Windows,那么可能電腦直接就卡死了。
但是,調(diào)試這種 OOM(Out of Memory)的問題有時候是非常困難的,因為你不知道代碼哪個地方會導(dǎo)致內(nèi)存泄露。但是如果你運行程序進(jìn)行調(diào)試,程序又會中途被殺掉或者直接卡死系統(tǒng)。
如果我們有辦法看到程序里面每一個函數(shù)占用的內(nèi)存大小,那么我們就能縮小檢查的范圍。
為了實現(xiàn)這個目的,我們可以安裝并使用一個叫做filprofiler
的第三方庫,它可以分析 Python 程序的內(nèi)存占用情況。
我們先安裝這個庫:
pip install filprofiler
然后寫一段會導(dǎo)致內(nèi)存泄露的代碼:
def func_a():
print('我是一個正常的函數(shù)')
def func_b():
print('我是第二個正常的函數(shù)')
def func_b():
print('我是第三個正常的函數(shù)')
def func_oom():
print('我是一個會導(dǎo)致內(nèi)存泄露的函數(shù)')
datas = []
while True:
datas.append('s' * 1024 * 1024)
print('運行程序的時候,你不會看到這一行')
def run():
func_a()
func_b()
func_oom()
run()
這段程序直接運行會因為內(nèi)存泄露的問題被系統(tǒng)直接殺死。
在使用 filprofiler 之前,還需要調(diào)整一下虛擬內(nèi)存的大??;否則,filprofiler 本身也會因為占用內(nèi)存過大的問題而被系統(tǒng)殺掉。
先使用free
命令看一下系統(tǒng)可用的內(nèi)存有多少:
我們使用ulimit
命令,把程序能夠使用的內(nèi)存稍稍調(diào)低一些,這樣即使被占滿,也不會被系統(tǒng)殺死:
ulimit -Sv 1600000
然后,使用 filprofiler 來運行這個程序:
fil-profile run test.py
運行效果如下圖所示:
filprofiler 會在當(dāng)前文件夾下面生成一個fil-result
文件夾,在里面會有一個以時間命名的文件夾,文件夾中會有兩個svg
文件,如下圖所示:
我們使用瀏覽器打開其中的out-of-memory.svg
文件,可以看到如下圖所示的內(nèi)存占用圖:
從圖中可以看到,占用內(nèi)存最大的函數(shù)是func_oom
,程序也是在這個地方崩潰的。
上述內(nèi)容就是Python 程序的內(nèi)存泄露該怎么解決,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。