簡體   English   中英

刪除numpy.ndarray的最后N個元素后的內存

[英]Memory after removing last N elements of numpy.ndarray

我有一個巨大的numpy.ndarray圖像array1 ,加載到RAM時需要60GB。 我需要刪除該數組的最后n元素。 一個簡單的解決方案是:

array1 = array1[:n-1]

但是,當我這樣做時,我沒有在RAM中獲得任何空間,為什么呢? 由於刪除了這些元素,如何獲得RAM中的可用空間? 我最初是為了獲得收益而進行移除。

array1[:n-1]是一個視圖,一個新的數組,與原始array1共享數據緩沖區。 即使您重新分配array1 ,其數據緩沖區也不會調整大小。

array1.resize(n-1) -文檔表明已調整大小/重新分配了數據緩沖區,前提是該緩沖區不與其他任何共享。

In [1105]: arr=np.arange(1000)
In [1106]: arr.nbytes
Out[1106]: 4000
In [1107]: sys.getsizeof(arr)   # those bytes plus overhead
Out[1107]: 4048
In [1108]: arr = arr[:500]      # your slice
In [1109]: arr.nbytes           # fewer bytes
Out[1109]: 2000
In [1110]: sys.getsizeof(arr)   # just the overhead
Out[1110]: 48

sys.getsizeof獲取視圖的大小,但是由於它與原始arr共享緩沖區,因此我們僅看到“開銷”。 原始的arr仍然存在,但無法通過名稱訪問。

In [1111]: arr=np.arange(1000)
In [1112]: arr.resize(500)
In [1113]: arr.nbytes
Out[1113]: 2000
In [1114]: sys.getsizeof(arr)
Out[1114]: 2048

使用resize方法,似乎已調整了數據緩沖區的大小,從而釋放了一半的空間。 但是我不確定是否有一種很好的測試方法,至少對於像這樣的小型陣列來說不是。

潛在地,我們有3個管理內存的系統-numpy,python解釋器和系統。 我們必須進一步深入研究代碼(可能是C-api),以找出在resize之后是將內存添加到某種numpy緩存中,還是由Python垃圾收集器收集或返回給系統。

============

resize然后重新resize shape似乎可以減小沿第一個軸的尺寸:

In [1120]: arr = np.arange(100).reshape(10,10).copy()
In [1121]: arr.resize(50)
In [1122]: sys.getsizeof(arr)
Out[1122]: 248
In [1123]: arr = np.arange(100).reshape(10,10).copy()
In [1124]: sys.getsizeof(arr)
Out[1124]: 456
In [1125]: arr.resize(50)
In [1126]: sys.getsizeof(arr)
Out[1126]: 248
In [1127]: arr.shape
Out[1127]: (50,)
In [1128]: arr.shape=(5,10)   # inplace reshape
In [1129]: arr
Out[1129]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM