【Python基礎】memory-profilerによるメモリ使用量の分析方法

  • URLをコピーしました!

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で大量の画像を作成する場合のメモリリークをしにくい方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする