この記事では、Pythonでオブジェクトを削除してメモリを解放する方法を解説します。
膨大なデータを扱うときやメモリ制限が設けられている場合などでは、明示的にメモリを解放したい場合があります。
そんな時は、del
文とgc.collect()
を使って明示的にメモリを解放しましょう!
オブジェクトの削除について
Pythonで不要になったオブジェクトは、特別な処理をしなくても「ガベージコレクタ」によって勝手に削除されます。
ガベージコレクタとは、メモリを管理する機能のことを言い、中でも不要になったメモリを解放する機能のことを「ガベージコレクション」と呼びます。
「勝手に消してくれるなら明示的に削除する必要なくね」と思うかもしれませんが、ガベージコレクションは不要になったメモリをすぐさま解放してくれるわけではありません。
なので、膨大なデータを扱う場合などでは、不要になったオブジェクトを明示的に削除してメモリをすぐさま解放しなければならない時があります。
オブジェクトの削除
オブジェクトを明示的に削除するにはdel
文を使います。
del 削除するオブジェクト
del
文は、複数のオブジェクトをまとめて削除することができ、
del 削除するオブジェクト1, 削除するオブジェクト2, 削除するオブジェクト3, ...
リストの要素や、
del リスト[インデックス]
辞書の要素も削除することができる。
del 辞書[key]
サンプル
生成した変数をdel
文で削除して出力できるか試してみます。
value = 1
print(value)
# 削除
del value
print(value)
実行結果
1
Traceback (most recent call last):
File "main.py", line 6, in
print(value)
NameError: name 'value' is not defined
メモリの解放
del
文でオブジェクトを削除しただけでは、メモリは解放されないので明示的にメモリを解放してやる必要があります。
明示的にメモリを解放するには、gc
モジュールのcollect()
を使います。gc
モジュールは、標準ライブラリなのでインポートするだけで使用可能です。
例えば以下のように、del
文でオブジェクトを削除してからgc.collect()
を実行する。
import gc
values = [1, 2, 3]
# オブジェクト削除
del values
# メモリ解放
gc.collect()
まとめ
この記事では、オブジェクトを削除してメモリを解放する方法を解説しました。
Pythonは、あまりメモリを気にしなくても扱うことができますが、ガベージコレクションではおっつかない場合は、明示的に解放してやりましょう!
del
文は必ずしも__del__()
メソッドを呼び出すとは限らない点に注意してください。
Linkクラスに __del__ メソッドを定義しているのですが、オブジェクトを削除したときに呼ばれません。- プログラミング FAQ — Python 3.10.4 ドキュメント
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ