MemoryError(大量データ処理時など)

Last Updated on 2025年7月28日

概要

Pythonで大量のデータを扱っているとき、突如として現れるのが MemoryError です。これは、その処理に必要なメモリ量が確保できなかったことを意味します。特に、大規模なファイルの読み込みや膨大なリスト、辞書などのデータ構造を扱う場合に発生します。

目次

エラー内容

MemoryErrorは、Pythonの実行中に確保できるメモリ量を超えてしまったときに発生します。典型的なエラー例は以下の通りです。

これはエラー発生時のメッセージが非常にシンプルで、どこでメモリ不足が起きたのか特定しづらいことが難点です。

原因

MemoryErrorが発生する主な原因は以下のようなものです。

  • 巨大なリストや辞書を一括生成している
  • 大きなCSVやJSONファイルを一気に読み込んでいる
  • 再帰的な関数でメモリを消費し続けている
  • リストのappendを繰り返して想定以上のサイズになっている
  • 生成されたデータを破棄せず保持し続けている

対処法

以下の方法でMemoryErrorを回避または軽減できます。

1. ジェネレータを使う

全データをリストに格納せず、yieldを使って1つずつ処理することでメモリ消費を抑えられます。

2. pandasで分割読み込み

pandasで大きなCSVファイルを読み込む場合、chunksize引数を使うことで分割して読み込めます。

3. メモリプロファイリング

memory_profilerライブラリなどを使い、どの関数がどれだけメモリを使っているかを特定しましょう。

4. データ構造の見直し

必要以上にメモリを食うデータ構造(例:ネストの深い辞書やリスト)を使っていないか確認し、軽量な構造に変えることも重要です。

5. 64bit Pythonを使う

32bit環境では使えるメモリ量に制限があります。64bit環境でのPythonを使用することで、メモリ上限が緩和される場合があります。

補足

MemoryErrorはOSやPythonのバージョン、使用しているライブラリなどにも依存するため、再現性のあるテストコードを用意しておくと、原因究明に役立ちます。

例えば、以下のようなコードはメモリを一気に使い切る典型例です。

このような操作は、極力避けるか、外部ストレージや一時ファイルを利用する設計にしましょう。

まとめ

MemoryErrorは大量データを扱う場面で頻出するエラーです。しかし、Pythonにはジェネレータ、チャンク処理、メモリプロファイリングといった対策手段があります。
安易に大きなデータを一括で処理せず、分割・最適化・可視化の3つの観点から設計することが重要です。