大規模なシステムを構築すると、ファイルやデータベースから様々なデータを読み込み、使用する変数・オブジェクトが増えてしまいます。
変数・オブジェクトのデータが増えるとシステムのパフォーマンス低下、パソコンの負担に繋がります。
パソコンの負担を抑え、パフォーマンスを向上させるには、貯まったオブジェクトを削除して意図的にメモリを解放する必要があります。今回はこの削除とメモリ解放の方法について解説しようと思います。
メモリ解放やオブジェクト削除が必要な理由
プログラムの解説へ入る前にメモリについて幾つか補足です。
ガベージコレクションとは?
システムを構築する際いくつか変数・オブジェクトを利用しますが、システムの実行完了前に不要なのも増えてきます。
ガベージコレクションは不要になった変数やオブジェクトのデータ、いわゆるゴミデータをメモリから自動的に解放する機能です。ゴミデータを解放することでパフォーマンスの向上に繋がり、処理速度の高速化が可能です。
メモリとは?
メモリとは、必要なデータを一時的に保管する場所のことを指します。
普段私たちが使用しているパソコンやスマホにもメモリは搭載されており、メモリのおかげでソフトやアプリを同時に複数立ち上げられます。
メモリが大きければ大きいほど同時に作業できる数が増えますが、使用しているメモリ数が少ないに越したことはありません。
メモリ使用量をできるだけ少なくする為に、ゴミデータの削除が必要になるのです。
メモリリークとは?
メモリリークとはプログラムバグの一種で、利用しないデータ(ゴミデータ)を保持したままメモリに残してしまい、不具合やパフォーマンス低下に繋がります。
先ほど紹介したガベージコレクションはシステムを動かす上で重要な役割を持っていますが、100%ゴミデータを解放してくれるわけではありません。
ゴミデータをしっかり解放するには、プログラム上で削除してあげる必要があります。
ゴミデータの解放は処理速度の高速化やパフォーマンス向上だけでなく、不具合やバグ対策にもなるので、できるだけ不要なデータを削除するようにしましょう。
del文を使ったオブジェクトの削除
では、はじめにオブジェクトの削除方法を紹介します。
del オブジェクト名
削除は1行で完了します。
[サンプルコード]
delStr = 'Pythonでメモリ解放'
delList = ['Python', 'メモリ', '解放']
delDictionary = {'Python' : 1, 'メモリ' : 2, '解放' : 3}
#メモリ解放前なので表示される
print(delStr)
print(delList)
print(delDictionary)
#オブジェクト削除
del delStr
del delList,delDictionary
#オブジェクト削除後なので表示されない
print(delStr)
print(delList)
print(delDictionary)
[出力結果]
Pythonでメモリ解放
['Python', 'メモリ', '解放']
{'Python': 1, 'メモリ': 2, '解放': 3}
Traceback (most recent call last):
File "c:\Users\プログラム\Python\memory\memory.py", line 15, in <module>
print(delStr)
NameError: name 'delStr' is not defined. Did you mean: 'delattr'?
6行目から8行目は、1行目から3行目でセットしている値を表示しています。
10行目は一つのオブジェクトを削除し、11行目は複数削除する場合の記述方法です。
13行目以降は6行目から8行目と同じコードですが、delによって削除されているため、コンソール上に表示されず、エラーが表示されます。
エラーの表示はオブジェクトが正しく削除されている証拠になります。
13行目をコメントアウトしてみるとリスト型のデータも削除されている事が分かります。
[サンプルコード]
Traceback (most recent call last):
File "c:\Users\プログラム\Python\memory\memory.py", line 16, in <module>
print(delList)
NameError: name 'delList' is not defined
gc.collect()を使ったメモリの解放
delでオブジェクトを削除すると値は削除されますが、メモリの解放までは行ってくれません。gcモジュールのcollect()で解放を行います。
gcモジュールとは、「ガベージコレクションの有効化や無効化」「デバッグオプションの設定」「オブジェクトの参照」などを扱えるモジュールです。Pythonの標準モジュールとしてインストールされているので、そのまま利用できます。
[サンプルコード]
import gc
delStr = 'Pythonでメモリ解放'
del delStr
#メモリを解放する
gc.collect()
1行目でgcモジュールをインポートし、メモリ解放を行うタイミングにgc.collect()を記述します。
メモリ解放を行えば空いた分他のデータを一時保管できるため、パフォーマンス向上に繋がります。