2016-03-30 20 views
0

Aşağıdaki programı çalıştırdığımda, bellek çok hızlı artar, dolayısıyla "secundary_function" adlı işlevde kullanılan belleğin serbest bırakılmadığını varsayalım. Sorunu listeye eklediğimde sorunu kopyalarsam veya secundary_function kullanmazsam sorun ortadan kalkar. Kopya burada gerekli olduğunu ve neden İşlev bittiğinde neden bellek serbest kalmıyor?

import numpy as np 
import time 

def main_function(N): 
    liste_images = [] 

    for i in range(N) : 
     images = np.zeros((3000,25,25)) 
     time.sleep(0.05) 
     secundary_function(images) 
     liste_images.append(images[0]) 

def secundary_function(images): 
    conservee = np.arange(len(images)) 
    images[conservee] 

main_function(6000) 

benim İngiliz cevaplar için teşekkür ederiz ve üzgün secundary_function kullanılan bellek üzerinde etkisi vardır neden .. anlamak istiyoruz! Bu doğrultuda

+0

3000x25x25 3D dizi 6000 kez oluşturuyorsunuz gibi görünüyor. Bu senin niyetin mi? – roadrunner66

+0

Ayrıca, bellek boşaltma için bu bağlantıya bakın: http://stackoverflow.com/questions/18310668/is-freeing-handled-differently-for-small-large-numpy-arrays – roadrunner66

+0

Orijinal program görüntüleri her zaman bir farklı 3D dizisi ve liste listesinde görünmesini istediğim 25x25 2D-dizilerinden bazılarını seçen bir test var. Ama aklımda, yeni bir 3B dizisi oluşturduğumda her defasında bellekler kurtarılmalı. –

cevap

2

:

liste_images.append(images[0]) 

images[0] 3000x25x25 images dizisinin bir görünüm oluşturur. Bu, liste_images'a eklediğiniz images[0] sonucunun, tüm 3000x25x25 dizisine bir referansa sahip olduğu anlamına gelir. Bu büyük dizi çöp toplanmayacak. Bir kopyasını yaptığınızda, yeni bir 25x25 dizi oluşturursunuz ve büyük dizi for döngüsünün sonraki yinelemesinde serbest bırakılabilir.

+0

Ama neden anlamıyorum, eğer 'secundary_function' işlevini kullanmazsam sorun ortadan kalkar ... –

+0

@YohanP. - Bu soruya bakın: http://stackoverflow.com/q/35382596/ –

+0

@morningsun Ok Teşekkür ederim. Sanırım anladım: çizgiyi değiştirdiğimde [images [conservee] '' by * images * 2 'problemi aynıdır. RAM'de değilse, diziyi nerede kullanamadığımı anlamıyorum. Sabit diskte mi? Çok yavaş olur mu? –

İlgili konular