Memray 是 Python 的記憶體分析器。它可以追蹤 Python 程式碼、本機擴充模組和 Python 解釋器本身中的記憶體分配。它可以產生多種不同類型的報告,幫助您分析捕獲的記憶體使用資料。雖然通常用作 CLI 工具,但它也可以用作庫來執行更細粒度的分析任務。
顯著特點:
Memray 可以幫助解決以下問題:
說明Memray 僅適用於 Linux 和 MacOS,無法安裝在其他平台上。
我們一直在尋找來自我們優秀社群的回饋❤️。如果您使用 Memray 來解決問題、分析應用程式、發現記憶體洩漏或其他任何事情,請告訴我們!我們很想聽聽您的經驗以及 Memray 如何幫助您。
請考慮在成功故事討論頁面中寫下您的故事。
這真的很重要!
Memray 需要 Python 3.7+,可以使用最常見的 Python 打包工具輕鬆安裝。我們建議使用 pip 安裝 PyPI 的最新穩定版本:
python3 -m pip install memray
請注意,Memray 包含 C 擴展,因此版本以二進制輪子和原始程式碼的形式分發。如果二進位輪不適用於您的系統(Linux x86/x64 或 macOS),您需要確保進行安裝的系統上符合所有相依性。
如果您希望從原始程式碼建置 Memray,您的系統中需要以下二進位依賴項:
檢查您的套件管理器以了解如何安裝這些依賴項(例如,在基於 Debian 的系統中apt-get install build-essential python3-dev libdebuginfod-dev libunwind-dev liblz4-dev
或在 MacOS 中brew install lz4
。請注意,您可能需要告訴編譯器在哪裡可以找到依賴項的頭檔和庫檔。例如,在具有brew
的MacOS中,您可能需要運行:
export CFLAGS= " -I $( brew --prefix lz4 ) /include " LDFLAGS= " -L $( brew --prefix lz4 ) /lib -Wl,-rpath, $( brew --prefix lz4 ) /lib "
在安裝memray
之前。檢查套件管理器的文檔,了解頭文件和庫文件的位置,以獲取更多詳細資訊。
如果您在 MacOS 上構建,您還需要設定部署目標。
export MACOSX_DEPLOYMENT_TARGET=10.14
安裝二進位依賴項後,您可以複製儲存庫並遵循正常的建置流程:
git clone [email protected]:bloomberg/memray.git memray
cd memray
python3 -m venv ../memray-env/ # just an example, put this wherever you want
source ../memray-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt
這將以開發模式在虛擬環境中安裝Memray(最後一個pip install
命令的-e
)。
如果您打算回饋,您應該安裝預提交掛鉤:
pre-commit install
這將確保您的貢獻通過我們的 linting 檢查。
您可以在此處找到最新的文檔。
使用 Memray 的方法有很多種。最簡單的方法是將其用作命令列工具來運行腳本、應用程式或庫。
usage: memray [-h] [-v] {run,flamegraph,table,live,tree,parse,summary,stats} ...
Memory profiler for Python applications
Run `memray run` to generate a memory profile report, then use a reporter command
such as `memray flamegraph` or `memray table` to convert the results into HTML.
Example:
$ python3 -m memray run -o output.bin my_script.py
$ python3 -m memray flamegraph output.bin
positional arguments:
{run,flamegraph,table,live,tree,parse,summary,stats}
Mode of operation
run Run the specified application and track memory usage
flamegraph Generate an HTML flame graph for peak memory usage
table Generate an HTML table with all records in the peak memory usage
live Remotely monitor allocations in a text-based interface
tree Generate a tree view in the terminal for peak memory usage
parse Debug a results file by parsing and printing each record in it
summary Generate a terminal-based summary report of the functions that allocate most memory
stats Generate high level stats of the memory usage in the terminal
optional arguments:
-h, --help Show this help message and exit
-v, --verbose Increase verbosity. Option is additive and can be specified up to 3 times
-V, --version Displays the current version of Memray
Please submit feedback, ideas, and bug reports by filing a new issue at https://github.com/bloomberg/memray/issues
要在腳本或單一 python 檔案上使用 Memray,您可以使用:
python3 -m memray run my_script.py
如果您通常使用python3 -m my_module
運行應用程序,則可以將-m
標誌與memray run
一起使用:
python3 -m memray run -m my_module
您也可以將 Memray 作為命令列工具調用,而無需使用-m
將其作為模組調用:
memray run my_script.py
memray run -m my_module
輸出將是一個二進位(如memray-my_script.2369.bin
),您可以透過不同的方式進行分析。一種方法是使用memray flamegraph
指令產生火焰圖:
memray flamegraph my_script.2369.bin
這將產生一個 HTML 文件,其中包含記憶體使用情況的火焰圖,您可以使用您喜歡的瀏覽器進行檢查。您可以使用多種其他報告器來產生其他類型的報告,其中一些產生基於終端的輸出,另一些會產生 HTML 文件。以下是 Memray 火焰圖的範例:
如果您想要一種簡單方便的方式在測試套件中使用memray
,可以考慮使用 pytest-memray。安裝後,這個 pytest 外掛程式允許您簡單地將--memray
加入到命令列呼叫中:
pytest --memray tests/
並會自動得到這樣的報告:
python3 -m pytest tests --memray
=============================================================================================================================== test session starts ================================================================================================================================
platform linux -- Python 3.8.10, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /mypackage, configfile: pytest.ini
plugins: cov-2.12.0, memray-0.1.0
collected 21 items
tests/test_package.py ..................... [100%]
================================================================================================================================= MEMRAY REPORT ==================================================================================================================================
Allocations results for tests/test_package.py::some_test_that_allocates
? Total memory allocated: 24.4MiB
? Total allocations: 33929
Histogram of allocation sizes: |▂ █ |
? Biggest allocating functions:
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 3.0MiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 2.3MiB
- _visit:/opt/bb/lib/python3.8/site-packages/astroid/transforms.py:62 -> 576.0KiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 517.6KiB
- __init__:/opt/bb/lib/python3.8/site-packages/astroid/node_classes.py:1353 -> 512.0KiB
如果執行所述測試分配的內存超過允許的內存,您還可以使用一些包含的標記使測試失敗:
@ pytest . mark . limit_memory ( "24 MB" )
def test_foobar ():
# do some stuff that allocates memory
要了解有關如何使用和配置插件的更多信息,請查看插件文件。
Memray 支援追蹤本機 C/C++ 函式以及 Python 函式。這在分析具有 C 擴展(例如numpy
或pandas
)的應用程式時特別有用,因為這可以全面了解擴展分配了多少記憶體以及 Python 本身分配了多少記憶體。
要啟動本機跟踪,您需要在使用run
子命令時提供--native
參數:
memray run --native my_script.py
這會自動將本機資訊新增至結果檔案中,並且任何報告器(例如火焰圖或表格報告器)都會自動使用它。這意味著不要在火焰圖中看到這一點:
現在您可以看到 Python 呼叫中發生了什麼:
記者以與 Python 幀不同的顏色顯示本機幀。也可以透過查看框架中的檔案位置來區分它們(Python 框架通常是從副檔名為.py 的檔案產生的,而本機框架是從副檔名為.c、.cpp 或.h 的檔案產生的) 。
Memray 的即時模式會在基於終端的介面中執行腳本或模組,讓您在執行時間互動式檢查其記憶體使用情況。這對於調試需要很長時間運行或表現出多種複雜記憶體模式的腳本或模組非常有用。您可以使用--live
選項以即時模式執行腳本或模組:
memray run --live my_script.py
或者如果你想執行一個模組:
memray run --live -m my_module
這將在您的終端機中顯示以下 TUI 介面:
結果按函數及其調用的子函數分配的總記憶體的降序顯示。您可以使用以下鍵盤快捷鍵變更順序:
t(預設):按總記憶體排序
o:依照自己的記憶排序
a:依分配數量排序
在大多數終端機中,您還可以點擊頁腳上的「按總數排序」、「按自己排序」和「按分配排序」按鈕。
已排序列的標題帶有下劃線。
預設情況下,live指令將呈現程式的主執行緒。您可以按大於鍵和小於鍵<
和>
查看程式的不同執行緒。在大多數終端機中,您也可以點擊頁腳上的「上一個執行緒」和「下一個執行緒」按鈕。
除了使用memray run
從 CLI 追蹤 Python 進程之外,還可以以程式設計方式在正在運行的 Python 程式中啟用追蹤。
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
詳細資訊請參閱API文件。
Memray 已獲得 Apache-2.0 許可,如 LICENSE 文件所示。
該項目已採用行為準則。如果您對本準則或您在專案中遇到的行為有任何疑問,請透過 [email protected] 與我們聯絡。
如果您認為您已發現此專案中的安全漏洞,請向專案團隊發送電子郵件至 [email protected],詳細說明可疑問題以及您發現的重現問題的任何方法。
請不要在 GitHub 儲存庫中開啟問題,因為我們希望將漏洞報告保密,直到我們有機會審查並解決它們。
我們歡迎您做出貢獻,幫助我們改進和擴展這個專案!
您將在下面找到為該專案做出貢獻所需的一些基本步驟。如果您對此流程或參與 Bloomberg 開源專案的任何其他方面有任何疑問,請隨時發送電子郵件至 [email protected],我們將盡快回答您的問題。
由於該專案是根據開源許可證的條款分發的,因此您所做的貢獻將根據相同的條款獲得許可。為了讓我們能夠接受您的貢獻,我們需要您明確確認您能夠並且願意根據這些條款提供這些貢獻,我們用於執行此操作的機制稱為開發者原產地證書 (DCO) 。這與 Linux 核心、Samba 和許多其他主要開源專案使用的過程非常相似。
要根據這些條款參與,您必須做的就是包含如下行作為貢獻中每個提交的提交訊息的最後一行:
Signed-Off-By: Random J. Developer <[email protected]>
完成此操作的最簡單方法是將-s
或--signoff
新增至git commit
命令中。
您必須使用您的真實姓名(抱歉,不能使用假名,也不能匿名投稿)。