2016-07-23 21 views
10

python3.5 silinen nesnenin değil tamamen ücretsiz hafıza Bunun nedeni pitonun içten Ancak, onları yeniden kullanmak istemiyorum, amacını yeniden kullanmak için memroy havuzunun çeşit muhafaza edebilir yapar görünüyor ve onları serbest istiyorum Linux üzerinde çalışan diğer programlar için bellek kullanılabilir hale getirmek.Python silinen nesnenin hafızası nasıl boşaltılır?

>>> 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 

Bu sadece bir oyuncak örneği, asıl sorun unfreeable bellek 20GB alarak çalışan bir sunucuda olduğunu. Burada

başka örnektir: toplanma yerine hemen silinir çöp kullanabildiği bir nesneyi silmeden sonra

>>> 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'da (veya otomatik veya yarı otomatik bellek yönetimi ile başka herhangi bir modern dilde) bellek yönetimi üzerinde hiçbir denetiminiz yoktur. – Daniel

+0

Python'u bir sunucu programında kullanmamız gerektiğinde, python3.5'in kaynak kodunun sunucularda kullanılabilir hale getirilmesi için nasıl değiştirileceğine dair gerçekten bir sorun mu var? –

+0

Sadece bir düşünce, ama büyük iş parçaları yapmak için alt işlem veya çok işlemcili modülleri kullanma hakkında ne? Bir Linux süreci sona erdiğinde, tüm anılarınızı geri almaz mıydınız? * python3.5'in kaynağını nasıl değiştirebilirim ... * en azından benim için bir başlatıcı gibi görünüyor. –

cevap

6

(wd1 dize anahtarları dict dict olduğunu) - yani sadece biraz zaman ver ve işleri hızlandırmak için bir gc.collect() serbest bırakacak veya tetikleyecektir.

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 
>>> 

Sonraki Morning:

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 
>>> 

Sadece başvuru için Python 3 kabuk geçmişi ile alınmış depolama belli bir miktar sadece başvuru için vb vardır aslında daha ki ipython 2 gibidir bir işlevde dict güncellemesini yaparak farklı olup olmadığını kontrol etmek: üretim kodu hala izini zorunda referans tutunuyorum olabilir gibi

>>> 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 
>>> 

Yani görünüyor.

+1

Sadece gc'ye aşina olmayan kişiler için bir not olarak, zaman duyarlı mantığın ortasında bir şey aramak için geçici olarak engelleyemez. – David

+0

30 dakika bekledi ve GC.Collect() birkaç kez koştu, hala 15,5859375 gösterir, aynı şey değil sadece python3 kabuk üzerindeki bir sunucu işleminde olur –

+0

serbest, unfreeable değil toplanabilir GC –

İlgili konular