Numpy使用自身部分视图覆盖数组时的内存管理问题
Numpy切片赋值后的内存管理问题
先看你给出的代码:
original = np.ones(1000000000, dtype=np.int8).reshape(10, 10000, 10000) # 1GB in size original = original[0, :, :] # 0.1GB in size?
你关心的是执行第二次赋值时,Numpy是否会做以下操作:
- 将
original的前100000000个元素复制到新数组中 - 释放原
original的全部内存 - 将名称
original指向新的0.1GB数组
同时你明确了单独的original[0, :, :]是partial view,不会触发内存分配,想知道赋值后原1GB内存是否保留。
答案是不会执行你说的这三个步骤,原1GB内存不会立刻被释放,具体逻辑如下:
original[0, :, :]本质是原数组的视图(view),它不会开辟新的内存存储数据,只是记录了对原数组数据的引用、切片的形状和步长信息,本身内存占用可以忽略。- 执行
original = original[0, :, :]时,只是把变量名original的指向从原来的1GB数组,切换到了这个视图对象上。 - 此时原1GB数组并没有被释放,因为视图对象还持有对它的引用,Python的垃圾回收机制只会回收没有任何引用的对象内存。
- 只有当这个视图对象也不再被任何变量引用时,原数组才会失去所有关联引用,最终被垃圾回收器回收内存。
简单说:这次赋值没有复制数据,原1GB内存会被视图“挂住”而保留,直到视图本身也被销毁,才会被回收。
内容的提问来源于stack exchange,提问作者jmborr
相关产品推荐
相关产品推荐

