Pythonでの開発中、スクリプトやアプリケーションのメモリ使用量を追跡することは非常に重要です。特に大量のデータを扱う場合、メモリ効率の悪いコードはパフォーマンスの低下やクラッシュを引き起こす原因となります。本記事では、Pythonを使ってメモリ使用量を確認するためのさまざまな方法とツールをご紹介します。
1. psutil ライブラリを使ったプロセスのメモリ使用量取得
psutil
は、プロセスやシステム情報を簡単に取得できるライブラリです。以下のコードで現在のプロセスが使用しているメモリを確認できます。
import psutil
# 現在のプロセスのメモリ使用量を取得
process = psutil.Process()
memory_info = process.memory_info()
print(f"RSS (Resident Set Size): {memory_info.rss / 1024 ** 2:.2f} MB")
print(f"VMS (Virtual Memory Size): {memory_info.vms / 1024 ** 2:.2f} MB")
- RSS (Resident Set Size): 実際に使用されている物理メモリ。
- VMS (Virtual Memory Size): 仮想メモリの総量。
インストール
psutil
をインストールするには、以下のコマンドを実行してください。
pip install psutil
2. tracemalloc でのメモリ使用量の追跡
Pythonの組み込みライブラリである tracemalloc
を使用すると、プログラム内のメモリ使用量を簡単に追跡できます。
import tracemalloc
# メモリの追跡を開始
tracemalloc.start()
# サンプルコード
x = [i for i in range(1000000)]
# 現在のメモリ使用状況を取得
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage: {current / 1024 ** 2:.2f} MB")
print(f"Peak memory usage: {peak / 1024 ** 2:.2f} MB")
# トラッキングを停止
tracemalloc.stop()
- Current memory usage: 現在使用中のメモリ量。
- Peak memory usage: トラッキング中にピークで使用されたメモリ量。
この方法は、特にメモリリークや効率の悪いメモリ使用の原因を特定する際に役立ちます。
3. resource ライブラリを使った物理メモリの取得(UNIX限定)
UNIX環境では、組み込みライブラリ resource
を使用してメモリ使用量を取得することができます。
import resource
# 使用中のメモリ量を取得 (単位: KB)
usage = resource.getrusage(resource.RUSAGE_SELF)
print(f"Max RSS: {usage.ru_maxrss / 1024:.2f} MB")
ru_maxrss
: プロセスが使用した最大の物理メモリ。
これはシンプルで便利ですが、Windowsではサポートされていない点に注意してください。
4. sys.getsizeof を使ったオブジェクトのメモリサイズ確認
特定のPythonオブジェクトのメモリ使用量を知りたい場合は、sys.getsizeof()
が便利です。
import sys
x = [i for i in range(1000)]
print(f"Size of list: {sys.getsizeof(x)} bytes")
# リスト内の要素を含むサイズを計算
total_size = sys.getsizeof(x) + sum(sys.getsizeof(i) for i in x)
print(f"Total size including elements: {total_size} bytes")
sys.getsizeof()
: オブジェクトの基本サイズを取得。- リストや辞書など、複雑な構造の場合は内部要素も考慮する必要があります。
5. memory-profiler を使ったスクリプト全体の分析
memory-profiler
は、スクリプト全体のメモリ使用量を行単位で可視化できるプロファイラです。
インストール
以下のコマンドでインストールします。
pip install memory-profiler
使用例
以下のように関数にデコレータを付けることで、メモリの増減を分析できます。
from memory_profiler import profile
@profile
def example_function():
x = [i for i in range(100000)]
return x
if __name__ == "__main__":
example_function() # ファイル実行時にメモリ使用量などが可視化
スクリプトを実行すると、関数ごとにメモリ使用量の変化が記録されます。
まとめ
Pythonでメモリ使用量を確認する方法は、状況や目的によって異なります。以下に各方法の用途をまとめました。
方法 | 主な用途 | 特徴 |
---|---|---|
psutil | プロセス全体のメモリ使用量を確認 | 簡単で汎用性が高い |
tracemalloc | メモリリークやピーク使用量の特定 | Python標準ライブラリで手軽に使用可能 |
resource | UNIX環境での物理メモリ使用量の確認 | シンプルだがUNIX限定 |
sys.getsizeof | オブジェクト単位のメモリ使用量を確認 | オブジェクトの基本サイズ確認に最適 |
memory-profiler | スクリプト全体の詳細なメモリ分析 | メモリ増減を可視化可能 |
これらのツールを活用して、メモリ効率の良いコードを開発し、パフォーマンス向上を目指しましょう!
参考: