💡

Your notebook tried to allocate more memory than is available.0 の解決法

に公開

原因

kaggleのnotebookで、許可量以上のメモリ(約33GB)を別のことに割り当てようとするとこのエラーが発生します。
エラー: Your notebook tried to allocate more memory than is available.0

解決策

メモリの使用量を減らす。

身も蓋もないですがこれに尽きます。

メモリ使用量の確認方法

import psutil

# システムの仮想メモリ情報を取得
mem = psutil.virtual_memory()
print(f'Total memory: {mem.total}')
print(f'Available memory: {mem.available}')
print(f'Used memory percentage: {mem.percent}%')
# Total memory: 33669922816
# Available memory: 32580337664
# Used memory percentage: 3.2%

メモリを効率的に使用するための手法

1. 変数の削除

メモリは割り当てられている変数の数に大きく影響されます。
ループ中などで不要な変数は

del variable

で消去しましょう。

2. データタイプ

float32やfloat64などを使用している場合、正規化などを行なってint32などにすることで大きくメモリ使用量が抑えられます。

3. ジェネレータ

リストの代わりにジェネレータを使用することで、イテレーション中に必要なデータのみをメモリに保持し、全てのデータを一度にメモリ上に載せる必要がなくなります。

4. ガベージコレクタの消去

Pythonではプログラムが使用しなくなったメモリ(ガベージ)を自動的に回収し、再利用可能にするシステムが使用されています。

おおまかに、参照されなくなったオブジェクトが消去されますが、この「参照されていない」というチェックはオブジェクトの世代によって変わります。

  • ジェネレーション0: 新しく生成されたオブジェクトがここに属します。ガベージコレクションは最も頻繁に行われ、多くのオブジェクトが短期間で解放されます。
  • ジェネレーション1: 数回のGCを行っても残っていた(参照されていた)オブジェクトがここに移動します。ここでは少ない頻度でガベージコレクションが行われます。
  • ジェネレーション2: より長期間生存するオブジェクトがここに移ります。ガベージコレクションの頻度はさらに低くなります。

この世代によってメモリが効率的に管理されています。

以下のコードで手動で解放することも可能で、明示的にメモリを減らすことができます。
・GC解放

import gc
gc.collect()

Summary

メモリ問題の解決法は以上です。
33GBは割と多めなのでメモリ不足になることは少ないかもしれませんが、もし不足した場合は今回の手法を試してみて下さい。

Discussion