2013-02-13 64 views
4

我有一個關於Numpy陣列內存管理的問題。假設我創建使用以下的緩衝一個numpy的數組:爲「S」Numpy陣列內存管理

>>> s = "abcd" 
>>> arr = numpy.frombuffer(buffer(s), dtype = numpy.uint8) 
>>> arr.flags 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : False 
    WRITEABLE : False 
    ALIGNED : True 
    UPDATEIFCOPY : False 
>>> del s # What happens to arr? 

在上面的情況下,是「ARR」持有參考?如果我刪除's',這會釋放爲's'分配的內存,從而使'arr'潛在地引用未分配的內存?

我有一些其他問題:

  • 如果這是有效的,Python是怎樣知道什麼時候,以釋放的'分配的內存? gc.get_referrents(arr)函數似乎沒有顯示'arr'持有對's'的引用。
  • 如果這是無效的,我如何註冊's'到'arr'的引用,以便Python GC在它的所有引用都不存在時自動收穫'?'

回答

5

下應該澄清的事情一點:

>>> s = 'abcd' 
>>> arr = np.frombuffer(buffer(s), dtype='uint8') 
>>> arr.base 
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00> 
>>> del s 
>>> arr.base 
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00> 

在第一種情況下del s沒有任何影響,因爲什麼陣列指向的是它創造了一個buffer,這不是其他地方引用。

>>> t = buffer('abcd') 
>>> arr = np.frombuffer(t, dtype='uint8') 
>>> arr.base 
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920> 
>>> arr.base is t 
True 
>>> del t 
>>> arr.base 
<read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920> 

在第二種情況下,當你del t,你擺脫變量t指向buffer對象,但由於陣列仍具有相同buffer參考,它不會被刪除。雖然我不確定如何檢查它,但如果您現在del arrbuffer對象應該丟失其最後一個參考並自動垃圾收集。

+0

在這兩種情況下,您都可以使用CPython中的sys.getrefcount來監視's'的refcount增量。不重要的是,它當然是有效的。 – seberg 2013-02-14 10:39:54