memory-profiler
前回、Pythonの「ModuleNotFoundError: No module named ‘skimage’」というえらーの対処法を紹介しました。

今回はPythonコードのメモリ使用量を分析するパッケージ「memory-profiler」を消化しいます。
それでは始めていきましょう。
memory-profilerのインストール
まずmemory-profilerをpipでインストールします。
またその際、「psutil」というライブラリも必要になるので、一緒にインストールします。
pip install memory_profiler
pip install psutil
使い方
使い方はまず「memory_profier」の「profile」をインポートします。
from memory_profiler import profile
そしてメモリ使用量を分析したいコードを関数化して、その前に「@profile」と記述します。
from memory_profiler import profile
import numpy as np
cycle = 100000
num = 100000
@profile
def random_val(cycle, num):
for i in range(cycle):
rng = np.random.default_rng()
val = rng.random(num)
random_val(cycle, num)
これで実行するとメモリ使用量を算出してくれます。
ただしJupyter Notebook上ではエラーとなりますので、Jupytextなどを用いてPythonのプログラムである「.py」として一度出力します。
Jupytextについてはこちらの記事で紹介していますので、よかったらどうぞ。

「.py」ファイルが出力できたら、ターミナルで「python プログラム名.py」を実行します。
私は先ほどのプログラムを「memory-1.py」として保存したので、コマンドはこんな感じになります。
python memory-1.py
実行結果
Filename: /Pythonコードがあるパス/memory-1.py
Line # Mem usage Increment Occurrences Line Contents
=============================================================
23 61.0 MiB 61.0 MiB 1 @profile
24 def random_val(cycle, num):
25 76.1 MiB 0.0 MiB 100001 for i in range(cycle):
26 76.1 MiB 2.6 MiB 100000 rng = np.random.default_rng()
27 76.1 MiB 12.6 MiB 100000 val = rng.random(num)
実行すると指定した関数の1行ごとにどれだけのメモリを使用しているのかが表示されます。
また時間に対するメモリ使用量のグラフを出すこともでき、その場合は2つのコマンドを使用します。
まずは分析をするコマンドで「mprof run プログラム名.py」です。
mprof run memory-1.py
実行結果
mprof: Sampling memory every 0.1s
running new process
running as a Python program...
Filename: memory-1.py
Line # Mem usage Increment Occurrences Line Contents
=============================================================
23 60.8 MiB 60.8 MiB 1 @profile
24 def random_val(cycle, num):
25 75.8 MiB 0.0 MiB 100001 for i in range(cycle):
26 75.8 MiB 2.5 MiB 100000 rng = np.random.default_rng()
27 75.8 MiB 12.6 MiB 100000 val = rng.random(num)
実行する際、ファイル名だけでは何故か実行できない時もあり、その場合は「./プログラム名.py」とすると実行できました。
分析結果は「mprofile_年月日時分秒.dat」という形のファイルに保存されます。
「.dat」ファイルが作成できたら、「mprof plot」を実行するとグラフが表示されます。
mprof plot
実行結果
Using last profile data.
2024-12-06 23:37:52.454 python3.13[26408:19557035] +[IMKClient subclass]: chose IMKClient_Modern

メモリリークをしているときに原因を探すのに重宝しそうです。
次回はこのmemory-profilerを使ってmatplotlibで大量の画像を作成する場合のメモリリークをしにくい方法を紹介します。
ではでは今回はこんな感じで。
コメント