【问题标题】:Python equivalent of free() for numpy arrays?Python 相当于 numpy 数组的 free()?
【发布时间】:2021-07-23 03:42:35
【问题描述】:

我有许多大型numpy 数组需要存储为dask 数组。在尝试从.npy 加载每个数组然后将其转换为dask.array 时,我注意到RAM 使用率几乎与常规numpy 数组一样多,即使在我将del arr 加载到arr 之后dask.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))?

【问题讨论】:

  • 写入磁盘阵列import gc; gc.collect()后试一试
  • Python 没有公开任何显式管理内存的方法
  • @Ehsan 需要注意,gc 只影响循环垃圾收集器
  • @Ehsan,我 tried gc 但这不起作用。内存仍未释放。
  • 你试过在你的对象上使用 'del' 然后调用 gc 吗?

标签: python numpy memory-leaks dask


【解决方案1】:

如果您收到MemoryError,您可能有几个选择:

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

来自this resource

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

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2023-03-17
    • 2016-03-09
    • 2011-05-16
    • 2011-05-05
    • 2017-06-24
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多