Last Updated on 2025年7月28日
概要
Pythonで大量のデータを扱っているとき、突如として現れるのが MemoryError です。これは、その処理に必要なメモリ量が確保できなかったことを意味します。特に、大規模なファイルの読み込みや膨大なリスト、辞書などのデータ構造を扱う場合に発生します。
目次
エラー内容
MemoryErrorは、Pythonの実行中に確保できるメモリ量を超えてしまったときに発生します。典型的なエラー例は以下の通りです。
|
1 |
MemoryError |
これはエラー発生時のメッセージが非常にシンプルで、どこでメモリ不足が起きたのか特定しづらいことが難点です。
原因
MemoryErrorが発生する主な原因は以下のようなものです。
- 巨大なリストや辞書を一括生成している
- 大きなCSVやJSONファイルを一気に読み込んでいる
- 再帰的な関数でメモリを消費し続けている
- リストのappendを繰り返して想定以上のサイズになっている
- 生成されたデータを破棄せず保持し続けている
対処法
以下の方法でMemoryErrorを回避または軽減できます。
1. ジェネレータを使う
全データをリストに格納せず、yieldを使って1つずつ処理することでメモリ消費を抑えられます。
|
1 2 3 4 |
def read_lines(file_path): with open(file_path, 'r') as f: for line in f: yield line |
2. pandasで分割読み込み
pandasで大きなCSVファイルを読み込む場合、chunksize引数を使うことで分割して読み込めます。
|
1 2 3 |
import pandas as pd for chunk in pd.read_csv('large.csv', chunksize=10000): process(chunk) |
3. メモリプロファイリング
memory_profilerライブラリなどを使い、どの関数がどれだけメモリを使っているかを特定しましょう。
|
1 2 3 4 5 6 |
from memory_profiler import profile @profile def load_data(): data = [x for x in range(10000000)] return data |
4. データ構造の見直し
必要以上にメモリを食うデータ構造(例:ネストの深い辞書やリスト)を使っていないか確認し、軽量な構造に変えることも重要です。
5. 64bit Pythonを使う
32bit環境では使えるメモリ量に制限があります。64bit環境でのPythonを使用することで、メモリ上限が緩和される場合があります。
補足
MemoryErrorはOSやPythonのバージョン、使用しているライブラリなどにも依存するため、再現性のあるテストコードを用意しておくと、原因究明に役立ちます。
例えば、以下のようなコードはメモリを一気に使い切る典型例です。
|
1 |
data = [x for x in range(10**9)] # 一気に10億要素を生成 |
このような操作は、極力避けるか、外部ストレージや一時ファイルを利用する設計にしましょう。
まとめ
MemoryErrorは大量データを扱う場面で頻出するエラーです。しかし、Pythonにはジェネレータ、チャンク処理、メモリプロファイリングといった対策手段があります。
安易に大きなデータを一括で処理せず、分割・最適化・可視化の3つの観点から設計することが重要です。


