arrays - 为每个操作选择正确的块大小
问题描述
我一直在研究一个需要生成大于内存的张量的程序,并且它与Dask
. 我遇到的唯一问题是操作需要很长时间,我想知道是否有办法加快我的程序。
特别是,最苛刻的操作是计算张量与其自身的张量外积,如下所示:
import dask.array as da
tensor = da.random.random(10, 20)
outer = da.multiply.outer(tensor, tensor)
由于我生成的数组大于内存(比示例中的大得多),我使用以下方法存储它们zarr
:
import zarr
storage = zarr.DirectoryStore('a_path')
da.to_zarr(outer, url=storage, compute=True, component='comp')
虽然如果生成的块大于4GB
,我会在调用之前再次重新分块数组to_zarr
,否则我会收到错误:ValueError: Codec does not support buffers of > 2147483647 bytes
.
我正在使用大约 600 GB RAM 的机器,我生成的外部产品的大小约为 700 GB(但我想尽可能大)。
我尝试过一些本地实验,以不同的方式(使用rechunk
)对数组进行分块并在本地比较速度,但我没有看到太大的差异。
此外,特别是对于张量外积,似乎所需的操作数量随着块的数量呈指数增长(我在 a 中对此进行了评估Jupyter notebook
),如果张量被过度分块,则计算失败(或者我得到一个性能警告)。另外,在计算出我的张量外积后,我需要对它们求和。
那么,有没有办法根据要计算的操作找出对张量进行分块的最佳方法是什么?
解决方案
推荐阅读
- javascript - 如何在 Next.js 中关闭 CSS 模块功能?
- angular - 如何将消息推送给每个用户的 UserAdmin
- c# - 由于 JSON 原因,如何将元素附加到 C# 数组?
- visual-studio - 当我们在 Visual Studio SSIS 项目中点击调试按钮时——它是在 32 位还是 64 位模式下运行——并且 32 位提供程序是否与 64 位运行模式兼容?
- c++ - c++中的this指针
- flutter - Flutter Null 检查运算符用于空值
- webpack - 由于缺少依赖关系,带有 babel 的 Yarn 2 monorepo 无法构建,但它正在查看错误的 package.json
- python - Django UserCreationForm 自定义
- datastage - 使用 RTP 时遍历作业中的字段
- python-3.x - AioHttp 获取请求上的 400 - 标头中的字符无效