辞書の辞書を考えてみましょう:
bigDict = { 'user1': userDict1, 'user2': userDict2 }
何百万ものユーザーが含まれており、すべての処理が完了したらメモリを解放したいとします。
以下で十分でしょうか。
del bigDict
または、次のようなことをする必要がありますか:
for userId, userDict in bigDict.iteritems():
del userDict
辞書の辞書を考えてみましょう:
bigDict = { 'user1': userDict1, 'user2': userDict2 }
何百万ものユーザーが含まれており、すべての処理が完了したらメモリを解放したいとします。
以下で十分でしょうか。
del bigDict
または、次のようなことをする必要がありますか:
for userId, userDict in bigDict.iteritems():
del userDict
辞書への唯一の参照が にある場合、bigDict
それを削除するだけでガベージ コレクターがトリガーされます。外部に参照があった場合、ループを使用してそれらをすべて削除しても何も起こりません。これは、del
単に「参照カウントを 1 つ減らす」ことを意味し、カウンターがゼロになった場合にのみオブジェクトが削除されるためです。
オブジェクトが解放されていることを確認する最も簡単な方法は、可能であればクロージャーで作成して使用することです。つまり、本体内で大きな辞書を作成して処理し、処理が完了すると一連の値を返す関数があります。このようにして、迷子の参照がないことを確認できます。もちろん、ほとんどの実用的な目的では、これは実際には不可能です。
同時に多数の小さなオブジェクトが存在する場合、それらのメモリは OS に戻されず、新しいオブジェクトのプールとして保持されることに注意してください。(この動作は Python 3 で部分的に改善されました)。メモリ管理が重要な場合は、配列オブジェクトを使用することをお勧めします。これにより、配列オブジェクトはもはや小さなオブジェクトではなくなります (そして、プロセスのオーバーヘッドを節約できます)。