2016-07-23 6 views
10

python3.5は削除されたオブジェクトのメモリを完全に解放していないようですが、これはPythonが内部的に何らかのmemroyプールを再利用目的で保持しているためかもしれませんが、再利用したくないので解放したいLinux上で実行されている他のプログラムでメモリを利用できるようにする。どのようにpython削除されたオブジェクトのメモリを解放するには?

>>> psutil.Process().memory_info().rss/2**20 
11.47265625 
>>> d = {x:x for x in range(10**7)} 
>>> psutil.Process().memory_info().rss/2**20 
897.1796875 
>>> del d 
>>> gc.collect() 
0 
>>> psutil.Process().memory_info().rss/2**20 
15.5859375 

これは単なるおもちゃの例であり、本当の問題はunfreeableメモリ20GBのを取って、実行しているサーバー上にあります。ここ

は別の例である:(WD1は、文字列のキーを持つ辞書の辞書です)

>>> psutil.Process().memory_info().rss/2**20 
28.1796875 
>>> wd1 = {x:{i:i for i in d} for x in k} 
>>> psutil.Process().memory_info().rss/2**20 
682.78125 
>>> del wd1 
>>> psutil.Process().memory_info().rss/2**20 
186.21484375 
+0

あなたは、python(または自動または半自動メモリ管理を備えた他の現代的な言語)のメモリ管理を制御できません。 – Daniel

+0

これは実際にサーバープログラムでpythonを使用する必要がある場合、python3.5のソースコードを変更してサーバー上で使用できるようにするためには問題ですか? –

+0

単なる考えですが、サブプロセスやマルチプロセスモジュールを使って大きな仕事をするのはどうですか? Linuxプロセスが終了すると、すべてのメモリを元に戻すことはできませんか? * python3.5のソースを修正する方法... *少なくとも、私にとっては初心者のように思えます。 –

答えて

6

あなたはそれがガベージコレクションではなく、すぐに削除に利用可能であるオブジェクトを削除したら - そうちょうどそれにいくつかの時間を与えるとし遅くなったり、遅くなったりしてgc.collect()が発生する可能性があります。履歴に取りストレージの特定の量は参考のために、等、があるという点でPythonの3シェルがよりipython 2のように、実際には単に参照のため

python.exe 
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import psutil 
>>> import gc 
>>> psutil.Process().memory_info().rss/2**20 
13.2890625 
>>> d = {x:x for x in range(10**7)} 
>>> psutil.Process().memory_info().rss/2**20 
359.13671875 
>>> del d 
>>> psutil.Process().memory_info().rss/2**20 
13.5234375 
>>> gc.collect() 
0 
>>> psutil.Process().memory_info().rss/2**20 
13.4375 
>>> 

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import psutil 
>>> psutil.Process().memory_info().rss/2**20 
13.1875 
>>> psutil.Process().memory_info().rss/2**20 
13.20703125 
>>> psutil.Process().memory_info().rss/2**20 
13.20703125 
>>> psutil.Process().memory_info().rss/2**20 
13.20703125 
>>> psutil.Process().memory_info().rss/2**20 
13.20703125 
>>> 22*3 
66 
>>> psutil.Process().memory_info().rss/2**20 
13.25390625 
>>> import gc 
>>> psutil.Process().memory_info().rss/2**20 
13.25390625 
>>> gc.collect() 
0 
>>> psutil.Process().memory_info().rss/2**20 
13.171875 
>>> 

翌朝機能で辞書の更新を行うことは異なっているかどうかを確認するために:あなたの製品コードは、あなたはまだ追跡する必要が参照にぶら下がっされる可能性がありますように

>>> psutil.Process().memory_info().rss/2**20 
13.1484375 
>>> D = {} 
>>> psutil.Process().memory_info().rss/2**20 
13.1484375 
>>> def UpdateD(d, v): 
...  """ Add the text and value for v to dict d """ 
...  d[v] = str(v) 
... 
>>> psutil.Process().memory_info().rss/2**20 
13.16015625 
>>> for x in range(10**7): 
...  UpdateD(D, x) 
... 
>>> psutil.Process().memory_info().rss/2**20 
666.6328125 
>>> del D 
>>> psutil.Process().memory_info().rss/2**20 
10.765625 
>>> gc.collect() 
0 
>>> psutil.Process().memory_info().rss/2**20 
12.8984375 
>>> 

をだから、見えます。

+1

gcに精通していない人々のためのメモと同様に、それは一時的に時間の影響を受けやすい論理の真中で呼び出す何かを間違いなくブロックします。 – David

+0

私は30分待ってgc.​​collect()を何回か実行したが、まだ15.5859375を表示していない。 –

+0

同じことがサーバープロセスで起こる。python3シェルではなく unfreeableとgc collectable –

関連する問題