Memray は Python 用のメモリ プロファイラです。 Python コード、ネイティブ拡張モジュール、および Python インタープリター自体のメモリ割り当てを追跡できます。キャプチャされたメモリ使用量データの分析に役立つ、いくつかの異なるタイプのレポートを生成できます。一般的に CLI ツールとして使用されますが、より詳細なプロファイリング タスクを実行するためのライブラリとしても使用できます。
注目すべき機能:
Memray は次の問題の解決に役立ちます。
注: Memray は Linux および MacOS でのみ動作し、他のプラットフォームにはインストールできません。
私たちは素晴らしいコミュニティからのフィードバックを常にお待ちしています❤️。問題の解決、アプリケーションのプロファイリング、メモリ リークの発見などに Memray を使用したことがありましたら、ぜひお知らせください。あなたの経験と、Memray がどのようにあなたを助けたかについてぜひお聞かせください。
成功事例ディスカッション ページにあなたのストーリーを書くことを検討してください。
それは本当に違いを生みます!
Memray には Python 3.7 以降が必要で、最も一般的な Python パッケージ化ツールを使用して簡単にインストールできます。 PyPI から pip を使用して最新の安定リリースをインストールすることをお勧めします。
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
)。依存関係のヘッダー ファイルとライブラリ ファイルの場所をコンパイラーに教える必要がある場合があることに注意してください。たとえば、MacOS でbrew
使用する場合は、次のコマンドを実行する必要がある場合があります。
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
これにより、開発モード (最後のpip install
コマンドの-e
) で仮想環境に Memray がインストールされます。
貢献する予定がある場合は、プリコミット フックをインストールする必要があります。
pre-commit install
これにより、あなたの投稿がリンティングチェックに確実に合格するようになります。
最新のドキュメントはここから入手できます。
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
で実行する場合は、 memray run
で-m
フラグを使用できます。
python3 -m memray run -m my_module
-m
使用してモジュールとして呼び出すことなく、Memray をコマンド ライン ツールとして呼び出すこともできます。
memray run my_script.py
memray run -m my_module
出力はバイナリ ファイル ( memray-my_script.2369.bin
など) となり、さまざまな方法で分析できます。 1 つの方法は、 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: 割り当て数で並べ替えます
ほとんどの端末では、フッターの「合計で並べ替え」、「所有者で並べ替え」、および「割り当てで並べ替え」ボタンをクリックすることもできます。
並べ替えられた列の見出しには下線が付きます。
デフォルトでは、ライブ コマンドはプログラムのメイン スレッドを表示します。大なりまたは小なりキー<
および>
を押すと、プログラムのさまざまなスレッドを確認できます。ほとんどの端末では、フッターの「前スレッド」ボタンと「次スレッド」ボタンをクリックすることもできます。
memray run
を使用して CLI から Python プロセスを追跡することに加えて、実行中の Python プログラム内で追跡をプログラムで有効にすることもできます。
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
詳細については、API ドキュメントを参照してください。
LICENSE ファイルに記載されているように、Memray は Apache-2.0 ライセンスを取得しています。
このプロジェクトは行動規範を採用しています。コード、またはプロジェクトで経験した行為について懸念がある場合は、[email protected] までご連絡ください。
このプロジェクトでセキュリティ上の脆弱性を特定したと思われる場合は、疑わしい問題と、それを再現するために見つけた方法の詳細を記載して、プロジェクト チーム ([email protected]) に電子メールを送信してください。
脆弱性レポートを確認して対処する機会が得られるまでは、脆弱性レポートを非公開にしておきたいため、GitHub リポジトリで問題を開かないでください。
このプロジェクトの改善と拡張にご協力いただくために、皆様の貢献を歓迎します。
以下に、プロジェクトに貢献するために必要な基本的な手順をいくつか示します。このプロセスや、ブルームバーグ オープンソース プロジェクトへの貢献に関するその他の側面についてご質問がある場合は、お気軽に [email protected] まで電子メールを送信してください。できるだけ早くご質問にお答えいたします。
このプロジェクトはオープンソース ライセンスの条件に基づいて配布されているため、あなたが行う貢献には同じ条件に基づいてライセンスが付与されます。当社があなたの貢献を受け入れることができるようにするには、あなたがこれらの条件に基づいて貢献を提供する能力と意欲があることをあなたから明示的に確認する必要があります。これを行うために当社が使用するメカニズムは、開発者の原産地証明書 (DCO) と呼ばれます。 。これは、Linux カーネル、Samba、その他多くの主要なオープン ソース プロジェクトで使用されるプロセスと非常に似ています。
これらの規約に基づいて参加するには、投稿内の各コミットのコミット メッセージの最終行として次のような行を含める必要があります。
Signed-Off-By: Random J. Developer <[email protected]>
これを実現する最も簡単な方法は、 git commit
コマンドに-s
または--signoff
追加することです。
実名を使用する必要があります (申し訳ありませんが、仮名や匿名の投稿は禁止です)。