メインコンテンツまでスキップ

extend-troubleshooting-oom-python

Last updated on July 14, 2026

注釈:本資料はAI技術を用いて翻訳されています。

注記

この記事はローカル開発のみを対象としています。

Pythonはガベージコレクタを使用してメモリを自動的に管理します。しかし、これは開発者がメモリ使用量に注意を払う必要がなくなるわけではありません。メモリ問題の一般的な原因には、以下が含まれます。

  • 非効率なデータ構造
  • 必要以上に長く大きなオブジェクトへの参照を保持すること
  • メモリリーク

メモリプロファイリング

メモリプロファイリングは、Pythonプログラムのメモリ消費量を理解し最適化するのに役立ちます。メモリプロファイリングに役立つ主要なツールと手法を以下に示します。

  1. memory_profiler

    プロセスのメモリ消費量を監視し、Pythonプログラムのメモリ消費量を行ごとに分析するためのPythonモジュールです。

    • インストール:
    pip install memory_profiler
    • 使用方法:
    mprof run python script.py
    mprof plot

    または

    # script.py

    import memory_profiler

    @memory_profiler.profile
    def my_function(a, b, c):
    ...
  2. objgraph

    Pythonのオブジェクトグラフを視覚的に探索できるモジュールです。

    • インストール:

    Graphvizが必要です。

    pip install objgraph
    • 使用方法:
    # script.py

    import objgraph

    # foo = my_function(a, b, c)
    objgraph.show_refs([foo], filename="objgraph.png")
  3. Guppy 3 - Heapy *

    Pythonプログラムにおけるメモリ関連の問題のデバッグと最適化をサポートします。

    • インストール:
    pip install guppy3
    • 使用方法:
    # script.py

    import guppy

    h = guppy.hpy()
    print(h.heap())

CPUプロファイリング

CPUプロファイリングは主に実行時間の観点からパフォーマンスのボトルネックを特定することに重点を置いていますが、コードを最適化することで間接的にメモリ使用量の管理にも役立ちます。以下にツールと手法を示します。

  1. cProfile and profile

    Pythonプログラムの決定論的なプロファイリングを提供します。

    • 使用方法:
    # script.py

    import cProfile

    cProfile.run("my_function(a, b, c)")
    # script.py

    import profile

    profile.run("my_function(a, b, c)")
  2. Line Profiler

    関数の行ごとのプロファイリングを行うためのモジュールです。

    • インストール:
    pip install line_profiler
    • 使用方法:
    # script.py

    import line_profiler

    @line_profiler.profile
    def my_function(a, b, c):
    ...
    kernprof -l -v script.py
    python -m line_profiler script.py.lprof

ベストプラクティス

ベストプラクティスに従うことで、メモリ不足(OOM)の問題を大幅に軽減できます。主要な戦略を以下に示します。

  1. Generators and Iterators(ジェネレーターとイテレーター)を使用する。

    • ジェネレーターとイテレーターは、すべてのデータを一度にメモリに読み込むことなく、大量のデータを処理するのに役立ちます。
  2. 適切なデータ構造を選択する。

    • 例: キュー操作に list の代わりにcollectionsdequeを使用する。
  3. グローバル変数の使用を制限する。

  4. 効率的なライブラリを使用する。

    • 例: 数値演算にはnumpy、データ操作にはpandasを使用する。

まとめ

Pythonでのメモリ不足の問題を回避するには、メモリ管理を理解し、プロファイリングツールを使用し、適切なコーディングプラクティスに従う必要があります。これらの戦略を統合することで、メモリを多用するタスクを効果的に処理する効率的なアプリケーションを構築できます。定期的なプロファイリング、慎重なコーディング、適切なデータ構造の選択が、最適なメモリ使用量を実現するために重要です。