首页 > 解决方案 > Python 相当于 numpy 数组的 free()?

问题描述

我有许多numpy需要存储为数组的大型dask数组。在尝试从中加载每个数组然后将.npy其转换dask.array为.numpydel arrarrdask.array

在这个例子中:

arr = np.random.random((100, 300))
print(f'Array ref count before conversion: {sys.getrefcount(arr) - 1}') # output: 1
dask_arr = da.from_array(arr)
print(f'Distributed array ref count: {sys.getrefcount(dask_arr) - 1}') # output: 1
print(f'Array ref count after conversion: {sys.getrefcount(arr) - 1}') # output: 3

我唯一的猜测是,在dask加载数组时,它创建了对numpy数组的引用。

如何释放内存并删除对内存位置的所有引用(如 C 中的 free(ptr))?

标签: pythonnumpymemory-leaksdask

解决方案


如果你得到一个MemoryError,你可能有几个选择:

  • 将您的数据分成更小的块。
  • 手动触发垃圾收集和/或通过 Worker Plugin 调整工人的 gc 设置(该操作已尝试但不起作用;无论如何我都会为其他读者提供)
  • malloc_trim使用(尤其是在处理非 NumPy 数据或小 NumPy 块时)修剪内存
  • 确保在计算运行时可以看到Dask Dashboard,以确定哪种方法有效。

这个资源

“在 Linux 和 MacOSX 上造成非托管内存的另一个重要原因并不广为人知,它源于libc malloc()/free()管理用户空间内存池的事实,因此free()不一定会将内存释放回操作系统。”


推荐阅读