我正在編寫一個代碼,在某處我需要解決大型稀疏矩陣的幾個廣義特徵值問題。因爲這些操作基本上是相似的(僅考慮矩陣的名稱正在改變),我做了一個功能: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
你可以嘗試強制內存釋放與GC.Collect的()。見http://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python。 –
這不會在所有情況下的CPython下(雖然你可能有更好的運氣與PyPy等),因爲CPython中從來沒有搬遷的對象('ID()'需要始終貫穿一個對象的生命週期返回相同的值)。的內存塊不能被限制,只要其保持至少一個活對象釋放。 – Kevin