python - Python 相当于 numpy 数组的 free()?
问题描述
我有许多numpy
需要存储为数组的大型dask
数组。在尝试从中加载每个数组然后将.npy
其转换dask.array
为.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))?
解决方案
如果你得到一个MemoryError
,你可能有几个选择:
- 将您的数据分成更小的块。
- 手动触发垃圾收集和/或通过 Worker Plugin 调整工人的 gc 设置(该操作已尝试但不起作用;无论如何我都会为其他读者提供)
malloc_trim
使用(尤其是在处理非 NumPy 数据或小 NumPy 块时)修剪内存- 确保在计算运行时可以看到Dask Dashboard,以确定哪种方法有效。
从这个资源:
“在 Linux 和 MacOSX 上造成非托管内存的另一个重要原因并不广为人知,它源于libc malloc()/free()
管理用户空间内存池的事实,因此free()
不一定会将内存释放回操作系统。”
推荐阅读
- react-native - 在警报中可以将变量连接成消息字符串吗?
- unit-testing - 使用反射获取私有方法,以便将其传递给 Kotlin 中的高阶函数
- arrays - vb.net:列出变量而不是值
- python - 'int' 对象不能从数组中调用
- gradle - 我们可以使用 gradle 更改子模块的构建顺序吗?
- javascript - Next.js 正在采取两个完整的 F5 刷新操作来在静态页面上显示新内容,并使用“重新验证:1”?我期待一个
- r - 从 URL 读取图像的 R 函数
- python - 如何为 Django 表格内联添加不同的占位符
- vba - 基于 Outlook 模板,从 Word 菜单创建电子邮件
- javascript - 如何让 HOC 对覆盖道具做出反应?