使用 Fil 檢測程式的記憶體使用量
運作你的 Python 程式,它崩潰了——它的記憶體不足。這隻是您的程式在記憶體不足情況下可能失敗的多種方式之一。
你怎麼知道是什麼用完了你的程式的所有記憶體?
一種方法是使用開源 Fil 記憶體分析器,它專門支援調試記憶體不足崩潰。 讓我們看看如何使用它。
一個例子
考慮以下 Python 程式:
import numpy as np
ALLOCATIONS = []
def add1(x):
ALLOCATIONS.append(np.ones((1024 * 1024 * x)))
def add2():
add1(5)
add1(2)
def main():
while True:
add2()
add1(3)
x = np.ones((1024 * 1024,))
if __name__ == '__main__':
main()
當我運作這個程式時,程序被 Linux 記憶體不足殺手殺死。不列印回溯。
$ python oom.py
Killed
現在,在這種情況下,程式足夠簡單,您可以通過讀取它來找出記憶體洩漏,但真正的程式不會那麼容易。是以你想要的是一個幫助你調試情況的工具,一個像 Fil 記憶體分析器這樣的工具。
使用 Fil 記憶體分析器
為了幫助您調試記憶體不足的崩潰,Fil 記憶體分析器支援在崩潰時轉儲目前的記憶體配置設定。事實上,它會盡最大努力及早發現問題,在您的計算機大幅減速或您的程序被作業系統殺死之前。
讓我們看看你如何使用 Fil 來調試它。
首先,在 virtualenv 中使用 pip 安裝 Fil(目前僅适用于 Linux 和 macOS):
$ pip install --upgrade pip
$ pip install filprofiler
確定您使用的是 v0.14.1 或更高版本,因為這包括改進的記憶體不足檢測。
接下來,我們在 filprofiler 下運作程式。filprofiler 檢測記憶體不足情況并寫出一份報告,說明進行了哪些記憶體配置設定導緻記憶體不足:
$ fil-profile run oom.py
...
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory.svg
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory-reversed.svg
filprofiler 會在目前檔案夾下面生成一個fil-result檔案夾,在裡面會有一個以時間命名的檔案夾,檔案夾中會有兩個svg檔案,如下圖所示:
這是
out-of-memory.svg
看起來的樣子:
正如你所看到的,這個節目正是所有的記憶都來自于工藝運作記憶體不足的時間。這意味着您現在有了減少記憶體使用量的起點。
此外,如果記憶體不足,Fil 将始終以退出代碼 53 退出,如果您以自動方式運作它,則可以輕松識别記憶體不足問題。
記憶體占用太高?
Fil 可以幫助您找出崩潰的程式在哪裡配置設定記憶體。但它也可以通過測量資料處理程式的峰值使用來幫助您處理非崩潰程式。