2016-02-10 17 views
7

私は、(600,800)や(3,600,800)のような数百の本当に大きな行列を持っています。numpy配列をNoneに設定してもメモリは空きますか?

したがって、私はもう本当に何も必要がないとすぐに、使用されているメモリの割り当てを解除したいと思います。

私は考えた:

some_matrix = None 

は、仕事をする、あるいは単にNoneに設定された基準が、どこかにまだメモリ内に割り当てられたスペースであるべきでしょうか? (あとでsome_matrixの再初期化のために割り当てられた領域を保存するのと同じように)

さらに、時々私は行列をスライスして何かを計算し、値をバッファに入れます時間)。したがって、リストをNoneに設定すると、間違いなくメモリが解放されます。

unset()の方法がありますか?全体の識別子とその参照先のオブジェクトが「削除」されていますか?

答えて

8

あなたは間違いなくgarbage collectionを見てみたいです。 C/C++のようないくつかのプログラミング言語とは異なり、スペースが不要になったときにプログラマが自分自身で動的に割り当てられたメモリを解放しなければならない場合、Pythonはガベージコレクションを持っています。 Python自体がメモリを解放することを意味するのはnecessaryです。

some_matrix = Noneを使用すると、変数をメモリ空間からリンク解除します。参照カウンタが減少し、0に達すると、ガベージコレクタはメモリを解放します。 del some_matrixをMSeifertの提案どおりに使用すると、メモリは解答とは異なり即座に解放されません。python docによると、これは何が起こるかです:名前の

削除は、ボンネットの下に何が起こったローカルまたはグローバル名前空間

からその名前のバインディング削除されることへの参照のカウンタNoneを割り当てるか、delを使用するかに関係なく、メモリ空間は1だけ減少します。このカウンタが0に達すると、ガベージコレクタは将来メモリ領域であるfreeになります。唯一の違いは、delを使用している場合、その名前がもう必要ないという文脈から明らかです。

ガベージコレクションのドキュメントを見ると、自分で呼び出すことも、パラメータの一部を変更することもできます。

3

Numpyは、参照カウンタがゼロの場合(または少なくとも参照カウンタを追跡し、OSがそのガベージを収集するようにする)、配列を削除します。

import numpy as np 
a = np.linspace(0,100, 10000000) 
b = a 
a = None 

は何も解放しないだろうしながら、例えば

import numpy as np 
a = np.linspace(0,100, 10000000) 
a = None 

を有する(好ましい方法はしかしdel aを書いている) "すぐに" メモリを解放します。


スライシングも記載しました。スライシングはデータのビューに過ぎず、したがって2番目の例とまったく同じです。同じ配列を参照する両方の変数を削除しないと、OSは配列を保持します。

私は何か非常にメモリが高価な場合、私は常に操作を行う別個の機能に固執し、本当に必要なものだけを返します。関数はそれ自身の後でクリーンアップされ、中間結果が解放されます(返されない場合)。

+0

関数/メソッドを明確にしてくれてありがとう。私はすでにローカル変数がreturnステートメントの後に(Javaや他の言語のように)捨てられていると仮定しましたが、Pythonが実際に同じことを実際に行っていることを聞いてうれしいです。しかし、 'del some_array'または一般に' del some_variable'は明示的にメモリを解放するための最初の選択であるべきですか? – daniel451

+0

'' del''は変数名を削除するので、削除された変数を含むそれ以降の操作はエラーを発生させます。一方、 '' a = None''は変数 '' a''を保持していますので、後でそれを実際に "削除"していることに気付かないかもしれません。 – MSeifert

+0

よろしくお願いいたします。しかし、2番目のシナリオは 'del'でも何も解放しません。したがって、 'del'は識別子とその参照を削除しますが、他の識別子がそれを参照していないときに参照の背後にあるオブジェクトは削除されます。だから、あなたの例では 'b'のように他の識別子がオブジェクトを参照する限り、ガベージコレクタはオブジェクトを削除しません。 – daniel451

関連する問題