2015-01-16 74 views
1

我正在編寫一個代碼,在某處我需要解決大型稀疏矩陣的幾個廣義特徵值問題。因爲這些操作基本上是相似的(僅考慮矩陣的名稱正在改變),我做了一個功能:Python:通過函數最小化內存使用情況

def eig_prob(myvariables): 
    # this is just a simplified example 
    name = 'iteration_'+myvariables["i"] 
    A = myvariables["A"] 
    B = myvariables["B"] 
    N = myvariables["nb_eig"] 
    Z,V = eigsh(A,N,B,sigma = 1) 
    # save in Matlab format 
    scipy.io.savemat(files["exec"]+name+".mat",{"Z":Z,"V":V}) 

由於我沒有任何參數回到我的主要功能,我希望RAM內存的量在致電eig_prob前後保持一致。

其實,我觀察到RAM內存的通話過程中增加約800萬桶至eig_prob消費,預計,這種內存不是呼叫,這似乎令我感到詫異後釋放。

對此類行爲有任何解釋嗎?可以避免嗎?我是否需要將我的功能作爲子流程運行以避免內存消耗過多?

編輯:我的同事表示gs.collect() [1]可能有幫助,它的確如此!在函數調用後,gs.collect()釋放800 Mb。

[1] https://docs.python.org/2/library/gc.html

+1

你可以嘗試強制內存釋放與GC.Collect的()。見http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python。 –

+0

這不會在所有情況下的CPython下(雖然你可能有更好的運氣與PyPy等),因爲CPython中從來沒有搬遷的對象('ID()'需要始終貫穿一個對象的生命週期返回相同的值)。的內存塊不能被限制,只要其保持至少一個活對象釋放。 – Kevin

回答

0

如果Python對象被分配,它正好是放置到程序的堆。

如果它是一個相當大的對象,內存將通過mmap(),只要它是需要,之後再次釋放分配。我不知道這是否立即發生......

對於較小的對象,該過程的邊界將被移位。在這種情況下,分配內存。如果之後添加了其他對象,並且前一個對象被釋放,則它們的內存在堆中是空閒的,但不能返回到操作系統。只有在堆的最末端對象被釋放後,部分空閒區才能返回到操作系統。

請您談一下800 MB,這顯然是如此之大,應使用mmap()方法,但如果數據由數千個較小的天體,有機會,他們的土地上brk()堆。

+0

似乎在我的情況下釋放內存的唯一方法是殺死進程... – Alain