【问题标题】:Memory after removing last N elements of numpy.ndarray删除 numpy.ndarray 的最后 N 个元素后的内存
【发布时间】:2016-12-26 01:38:26
【问题描述】:

我有一个巨大的numpy.ndarray 图像array1,加载到 RAM 时需要 60GB。我需要删除该数组的最后一个 n 元素。一个简单的解决方案是:

array1 = array1[:n-1]

但是当我这样做时,我没有在 RAM 中获得任何空间,这是为什么呢? 由于删除了这些元素,我怎样才能在 RAM 中获得可用空间?我最初是为了获得这个收益而删除的。

【问题讨论】:

  • 查看np.resize的文档

标签: python arrays numpy memory


【解决方案1】:

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 后跟一个新的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]])

【讨论】:

  • 只要它是第一个轴,resize 后跟一个就地 reshape 似乎可以工作。
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2012-08-20
相关资源
最近更新 更多