2014-08-27 51 views
1

我正在處理佔用大量內存的非常大的numpy/scipy陣列。假設我的代碼如下所示:如何刪除python函數中的對象?

def do_something(a): 
    a = a/a.sum() #new memory is allocated 
    #I don't need the original a now anylonger, how to delete it? 
    #do a lot more stuff 

#a = super large numpy array 
do_something(a) 
print a #still the same as originally (as passed by value) 

所以我打電話給一個巨大的numpy數組。然後該函數以某種方式處理數組,但原始對象仍保留在內存中。有什麼方法可以釋放函數內的內存嗎?刪除參考不起作用。

+0

刪除引用不起作用,因爲主叫方仍持有該對象的引用。他們可能需要它,所以你不能僅僅在它們上面釋放它。 – kindall 2014-08-27 15:53:05

+0

爲你的函數添加一個'return a',並將其稱爲'a = do_something(a)'。最初由'a'指向的數組不會有任何指向它的引用,並且將被垃圾收集。 – Jaime 2014-08-27 17:05:18

+0

只要del函數在函數中被調用,或者僅在返回後才被刪除? – fsociety 2014-08-27 19:47:26

回答

3

你想要什麼都做不到;當數組對象的所有引用都不存在時,Python將只釋放內存,並且不能從函數中刪除調用名稱空間中的a引用。

而是將問題分解成更小的步驟。用一個函數在a上進行計算,然後刪除a,然後調用另一個函數來完成剩餘的工作。

+0

猜猜這就是要走的路。另一個解決方案是將功能中的所有內容都作爲解決方法進行引用。 – fsociety 2014-08-27 16:13:40

0

Python與簡單的GC算法一起工作,基本上它有一個引用計數(它也有一個代GC),也就是說,對象的每個引用都增加一個計數器,並且每個對象都退出範圍遞減範圍。 只有在計數器達到0之後,纔會釋放內存。

因此,當您引用該對象時,它會保留內存。

在你的情況下,do_something的調用者仍然有對該對象的引用,如果你想讓這個變量消失,你可以減少該變量的範圍。

如果您懷疑內存泄漏,您可以設置DEBUG_LEAK標誌,並檢查輸出,更多的信息在這裏:https://docs.python.org/2/library/gc.html