You need to enable JavaScript to run this app. numpy数组对应C语言free()的实现方法,dask转换后内存不释放怎么办
优惠活动
大模型
产品
解决方案
定价
更多

numpy数组对应C语言free()的实现方法,dask转换后内存不释放怎么办

Dask数组持有numpy数组引用导致内存无法释放的解决方法

原因说明

da.from_array默认会将输入的numpy数组直接绑定到自身的计算逻辑中,持有该数组的强引用,因此你删除自行定义的arr变量后,dask数组本身仍然保留着对这块内存的引用,无法被Python的垃圾回收机制回收,内存占用不会下降。你测试得到的引用计数上升到3,多出的2个引用就来自dask内部的计算图存储。

解决方案

方案1:直接从npy文件创建dask数组(适配你的使用场景,性能最优)

不需要先把整个npy文件加载为numpy数组再转dask,直接使用内存映射模式读取npy文件构建dask数组即可,全程不会将全量数组加载到内存:

# 以只读内存映射模式加载npy,不会读取全量数据到内存
memmap_arr = np.load("large_array.npy", mmap_mode="r")
# 按自定义分块大小构建dask数组,仅持有内存映射对象,内存占用极低
dask_arr = da.from_array(memmap_arr, chunks=(10, 300)) # 分块大小可按需调整

后续即使删除memmap_arr变量,dask的所有操作也可以正常运行,不会占用全量数组的内存。

方案2:已加载的numpy数组转dask后释放原内存

如果你已经把numpy数组加载到内存,转dask后需要释放原数组内存,可以按以下步骤操作:

import gc
arr = np.random.random((100, 300))
dask_arr = da.from_array(arr, chunks=(10, 300))
# 持久化dask数组,dask会自行管理分块内存,不再依赖原numpy数组
dask_arr = dask_arr.persist()
# 删除所有指向原numpy数组的变量
del arr
# 主动触发垃圾回收
gc.collect()

操作完成后原numpy数组占用的内存就会被完全释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 09:06:00