You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何显式释放numpy数组占用的内存?

如何显式释放与numpy数组关联的内存?

你的核心问题是:函数内部删除数组引用后,外部仍存在对原数组的引用,导致内存无法释放,进而引发内存不足错误。以下是可行的解决方案:

方法一:修改原数组大小以释放内存

numpy数组是可变对象,函数内对数组的修改会直接作用于外部的原数组。通过调用resize(0)可以让数组释放底层的大内存,同时将数组变为空数组,之后强制触发垃圾回收即可:

import numpy as np
import gc

big_arr = ...  # 你的大数组
def process_big_arr(arr: np.ndarray) -> np.ndarray:
    big_intermediate_arr_1 = ...  # 基于arr的运算结果
    # 修改原数组大小为0,释放底层内存
    arr.resize(0)
    # 强制触发垃圾回收,确保内存被及时释放
    gc.collect()
    # 此时内存已释放,可以创建后续的大数组
    big_intermediate_arr_2 = ...
    big_output_arr = ...
    return big_output_arr

output = process_big_arr(big_arr)

这种方法安全且符合numpy的内存管理机制,修改后外部的big_arr会变成空数组,原内存被彻底释放。

方法二:手动释放底层内存(仅适用于拥有独立内存的数组)

如果数组是拥有自己独立内存的(即arr.base is None,不是其他数组的视图),可以通过ctypes手动释放其底层内存。这种方法更激进,需确保没有其他引用指向该内存块:

import numpy as np
import ctypes
import gc

big_arr = ...
def process_big_arr(arr: np.ndarray) -> np.ndarray:
    big_intermediate_arr_1 = ...
    # 仅处理拥有独立内存的数组
    if arr.base is None:
        # 获取数组的底层内存指针
        data_ptr = arr.__array_interface__['data'][0]
        # 手动释放内存
        ctypes.free(data_ptr)
        # 修改数组的接口信息,避免后续访问出错
        arr.__array_interface__['data'] = (0, False)
        # 将数组重置为空
        arr.resize(0)
    gc.collect()
    big_intermediate_arr_2 = ...
    big_output_arr = ...
    return big_output_arr

output = process_big_arr(big_arr)

注意:这种方法存在风险,如果有其他视图或引用指向该内存块,手动释放会导致内存访问错误,仅在确认无其他引用时使用。

关键说明

  • Python的内存管理基于引用计数,只要存在对数组对象的引用,数组本身不会被销毁,但通过resize(0)可以让数组释放其占用的大内存块,仅保留空数组的极小内存。
  • del arr仅删除当前作用域内的引用,无法影响外部的big_arr引用,因此无法直接触发内存释放。

内容的提问来源于stack exchange,提问作者Myridium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:53:21