溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么調(diào)試Python程序的內(nèi)存泄露問題

發(fā)布時(shí)間:2021-11-01 16:39:27 來源:億速云 閱讀:315 作者:iii 欄目:編程語言

這篇文章主要講解了“怎么調(diào)試Python程序的內(nèi)存泄露問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么調(diào)試Python程序的內(nèi)存泄露問題”吧!

如果大家在 Linux 或者 macOS 下面運(yùn)行一段可能導(dǎo)致內(nèi)存泄露的程序,那么你可能會看到下面這樣的情況:

怎么調(diào)試Python程序的內(nèi)存泄露問題

而如果你用的系統(tǒng)是 Windows,那么可能電腦直接就卡死了。

但是,調(diào)試這種 OOM(Out of  Memory)的問題有時(shí)候是非常困難的,因?yàn)槟悴恢来a哪個(gè)地方會導(dǎo)致內(nèi)存泄露。但是如果你運(yùn)行程序進(jìn)行調(diào)試,程序又會中途被殺掉或者直接卡死系統(tǒng)。

如果我們有辦法看到程序里面每一個(gè)函數(shù)占用的內(nèi)存大小,那么我們就能縮小檢查的范圍。

為了實(shí)現(xiàn)這個(gè)目的,我們可以安裝并使用一個(gè)叫做filprofiler的第三方庫,它可以分析 Python 程序的內(nèi)存占用情況。

我們先安裝這個(gè)庫:

pip install filprofiler

然后寫一段會導(dǎo)致內(nèi)存泄露的代碼:

def func_a():     print('我是一個(gè)正常的函數(shù)')  def func_b():     print('我是第二個(gè)正常的函數(shù)')  def func_b():     print('我是第三個(gè)正常的函數(shù)')  def func_oom():     print('我是一個(gè)會導(dǎo)致內(nèi)存泄露的函數(shù)')     datas = []     while True:         datas.append('s' * 1024 * 1024)     print('運(yùn)行程序的時(shí)候,你不會看到這一行')   def run():     func_a()     func_b()     func_oom()   run()

這段程序直接運(yùn)行會因?yàn)閮?nèi)存泄露的問題被系統(tǒng)直接殺死。

在使用filprofiler之前,還需要調(diào)整一下虛擬內(nèi)存的大小。否則,filprofiler本身也會因?yàn)檎加脙?nèi)存過大的問題而被系統(tǒng)殺掉。

先使用free命令看一下系統(tǒng)可用的內(nèi)存有多少:

怎么調(diào)試Python程序的內(nèi)存泄露問題

系統(tǒng)可用內(nèi)存為1619456 KB

我們使用ulimit命令,把程序能夠使用的內(nèi)存稍稍調(diào)低一些,這樣即使被占滿,也不會被系統(tǒng)殺死:

ulimit -Sv 1600000

然后,使用 filprofiler 來運(yùn)行這個(gè)程序:

fil-profile run test.py

運(yùn)行效果如下圖所示:

怎么調(diào)試Python程序的內(nèi)存泄露問題

filprofiler  會在當(dāng)前文件夾下面生成一個(gè)fil-result文件夾,在里面會有一個(gè)以時(shí)間命名的文件夾,文件夾中會有兩個(gè)svg文件,如下圖所示:

怎么調(diào)試Python程序的內(nèi)存泄露問題

我們使用瀏覽器打開其中的out-of-memory.svg文件,可以看到如下圖所示的內(nèi)存占用圖:

怎么調(diào)試Python程序的內(nèi)存泄露問題

從圖中可以看到,占用內(nèi)存最大的函數(shù)是func_oom,程序也是在這個(gè)地方崩潰的。

感謝各位的閱讀,以上就是“怎么調(diào)試Python程序的內(nèi)存泄露問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么調(diào)試Python程序的內(nèi)存泄露問題這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI