天天看點

使用 filprofiler 分析器調試 Python 記憶體不足崩潰

使用 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檔案,如下圖所示: 

使用 filprofiler 分析器調試 Python 記憶體不足崩潰

這是​

​out-of-memory.svg​

​看起來的樣子:

使用 filprofiler 分析器調試 Python 記憶體不足崩潰

正如你所看到的,這個節目正是所有的記憶都來自于工藝運作記憶體不足的時間。這意味着您現在有了減少記憶體使用量的起點。

此外,如果記憶體不足,Fil 将始終以退出代碼 53 退出,如果您以自動方式運作它,則可以輕松識别記憶體不足問題。

記憶體占用太高?

Fil 可以幫助您找出崩潰的程式在哪裡配置設定記憶體。但它也可以通過測量​​資料處理程式的峰值使用來​​​幫助您處理非崩潰​​程式​​。