使用numpy.delete删除对象数组元素是否会引发内存泄漏?
结论
这一现象不属于内存泄漏,是Python内存管理机制、numpy数组操作特性共同导致的正常表现。
原因说明
- 你测试中观测到的"删除后对象指针依然存在"是正常现象:你的测试代码先将待删除对象的引用存入了
pointers变量,相当于主动给这些对象增加了额外的引用计数。只要pointers还在作用域内没有被销毁,这些对象的引用计数就不会归0,自然不会被Python的垃圾回收器回收。即使你没有主动保存引用,Python的垃圾回收也不是实时执行的,对象失去所有引用后,对应的内存也不会立刻返还给操作系统,而是会被Python解释器留存,供后续新创建的对象复用,因此进程RSS看不到下降属于正常情况。 - 总内存微涨是
np.delete的执行逻辑导致的临时开销:np.delete并非在原数组上原地修改,而是会先创建一个删除了指定元素的新数组,再将新数组赋值给原变量,新旧数组交替的瞬间会同时占用两份数组内存,再加上操作过程中生成的临时变量,会导致几KB级别的内存小幅上涨,这些临时占用的内存会在后续临时对象被回收后释放。
内存泄漏的判断标准
只有当你反复执行删除操作成千上万次后,进程内存占用出现持续线性上涨、且没有回落趋势时,才属于内存泄漏。单次操作的KB级内存浮动属于正常范围,无需额外处理。
正确的排查方法
如果需要验证对象是否能被正常回收,可以按以下步骤操作:
- 删除所有主动保存的对象引用:执行
del pointers,再删除原数组变量 - 手动触发全量垃圾回收:调用
gc.collect()(需要先import gc) - 再观测进程内存变化即可
注意:
sys.getsizeof()只能获取numpy数组本身的内存大小,无法统计数组内存储的Python类对象的总内存,不能用该值判断整体内存占用变化。
内容的提问来源于stack exchange,提问作者notMyName
相关产品推荐
相关产品推荐

