はじめに
業務で Python のメモリ監視を行う機会があり、その際に使用したライブラリを紹介します。
使用するライブラリ
1. tracemalloc
Python 標準ライブラリです。Python レベルでのメモリ割り当てを監視し、どのコードがどれだけメモリを消費しているかを把握できます。
2. psutil
OS レベルでのメモリ使用量や CPU 利用率を取得するためのライブラリです。
ライブラリ比較
特性 | tracemalloc | psutil |
---|---|---|
目的 | Pythonのメモリ使用量の追跡 | プロセス全体のメモリ使用量の取得 |
対象 | Pythonのメモリ使用量 | プロセス全体のメモリ使用量 |
利用目的 | Pythonコードのメモリリークの特定 | プロセス全体のメモリ使用状況を確認 |
ライブラリ区分 | 標準ライブラリ | サードパーティライブラリ |
サンプルコード
以下は、10 回のループ内で大量のリストを生成しつつ、メモリの使用状況を毎秒出力するコードです。
import os
import time
import tracemalloc
import psutil
def memory_usage():
tracemalloc.start()
process = psutil.Process(os.getpid())
data = []
for i in range(10):
# メモリを消費する処理
data.extend([x for x in range(1000000)])
current, peak = tracemalloc.get_traced_memory()
rss = process.memory_info().rss
print(
f"ループ{i + 1}回目: 現在のメモリ使用量: {current / 1024 / 1024:.2f} MB\t"
f"最大メモリ使用量: {peak / 1024 / 1024:.2f} MB\t"
f"RSS: {rss / 1024 / 1024:.2f} MB"
)
time.sleep(1)
tracemalloc.stop()
if __name__ == "__main__":
memory_usage()
実行結果
- 現在のメモリ使用量と最大メモリ使用量は tracemalloc で取得
- RSS は psutil で取得
$ python3 tracemalloc_demo.py
ループ1回目: 現在のメモリ使用量: 34.33 MB 最大メモリ使用量: 42.39 MB RSS: 141.98 MB
ループ2回目: 現在のメモリ使用量: 68.66 MB 最大メモリ使用量: 76.72 MB RSS: 290.32 MB
ループ3回目: 現在のメモリ使用量: 102.98 MB 最大メモリ使用量: 111.04 MB RSS: 444.60 MB
ループ4回目: 現在のメモリ使用量: 137.31 MB 最大メモリ使用量: 145.37 MB RSS: 543.75 MB
ループ5回目: 現在のメモリ使用量: 171.63 MB 最大メモリ使用量: 179.69 MB RSS: 722.29 MB
ループ6回目: 現在のメモリ使用量: 205.96 MB 最大メモリ使用量: 214.02 MB RSS: 836.75 MB
ループ7回目: 現在のメモリ使用量: 240.29 MB 最大メモリ使用量: 248.34 MB RSS: 951.69 MB
ループ8回目: 現在のメモリ使用量: 282.24 MB 最大メモリ使用量: 290.30 MB RSS: 1066.65 MB
ループ9回目: 現在のメモリ使用量: 308.94 MB 最大メモリ使用量: 316.99 MB RSS: 1308.43 MB
ループ10回目: 現在のメモリ使用量: 352.80 MB 最大メモリ使用量: 360.86 MB RSS: 1424.41 MB
参考