dask - 从 gcs 上已阻止的数据中定义 dask 数组
问题描述
我想从已经分块的数据中创建一个 3d dask 数组。我的数据由 216 个块组成,每个块包含 1024x1024x1024 uint8 个体素,每个块都存储为一个压缩的 hdf5 文件,其中一个名为 data 的键。压缩后,我的数据每块只有几兆字节,但解压后,每块需要 1GB。此外,我的数据目前存储在谷歌云存储 (gcs) 中,尽管我可能会在容器内本地镜像它。
我认为最简单的方法是使用 zarr,按照这些说明(https://pangeo.io/data.html)。xarray 是否必须在保存为 zarr 格式之前解压缩我的数据?它是否必须打乱数据并尝试跨块进行通信?有没有从 hdf5 块组装 zarr 的较低级别的方法?
解决方案
那里有几个问题,所以我会尽量简短,并希望一些编辑可以充实我可能遗漏的细节。
您无需执行任何操作即可将数据视为单个 dask 数组,因为您可以将各个块引用为数组(参见此处),然后使用堆栈/连接函数构建单个数组。不过,这确实意味着打开客户端中的每个文件,以便读取肉类数据。
同样, xarray 具有一些用于读取文件集的功能,您应该能够在其中假设 dtype 和维度的一致性 - 请参阅他们的文档。
就 zarr 而言,您可以使用 dask 在 GCS 上为您创建文件集或不使用,并选择使用与输入相同的分块方案 - 这样就不会有改组。由于 zarr 的设置和理解非常简单,您甚至可以自己创建 zarr 数据集并一个接一个地写入块,而无需从 zarr 文件预先创建 dask 数组。这通常是通过 zarr API 进行的,并且写入一大块数据不需要对元数据文件进行任何更改,因此可以并行完成。理论上,如果您了解低级数据表示(例如,C 数组布局中的 int64),您可以简单地复制一个块;但是,我不知道在原始 hdf 和 zarr 中提供完全相同的压缩机制的可能性有多大(请参阅此处)。
推荐阅读
- c++ - 为什么项目中没有必要的头文件?
- c# - c#:添加两个大整数会给出错误的结果
- javascript - 如何在 Sequelize 中类型为 TIME 的列中创建位置?
- rest - 如何在颤动中处理列表/实体操作?
- html - 带有overflow-x滚动和文本左、中、右对齐的响应行
- php - Wordpress:如何覆盖特定的更新通知
- node.js - 构建 webpack.dll 时找不到 Nodejs NPM 模块
- python - 从数据框中删除行并重置索引
- python - 在python中将数据框转换为嵌套的json
- swift - 创建一个 React-Native 桥接 iOS 类的实例