首页 > 解决方案 > 从 gcs 上已阻止的数据中定义 dask 数组

问题描述

我想从已经分块的数据中创建一个 3d dask 数组。我的数据由 216 个块组成,每个块包含 1024x1024x1024 uint8 个体素,每个块都存储为一个压缩的 hdf5 文件,其中一个名为 data 的键。压缩后,我的数据每块只有几兆字节,但解压后,每块需要 1GB。此外,我的数据目前存储在谷歌云存储 (gcs) 中,尽管我可能会在容器内本地镜像它。

我认为最简单的方法是使用 zarr,按照这些说明(https://pangeo.io/data.html)。xarray 是否必须在保存为 zarr 格式之前解压缩我的数据?它是否必须打乱数据并尝试跨块进行通信?有没有从 hdf5 块组装 zarr 的较低级别的方法?

标签: dask

解决方案


那里有几个问题,所以我会尽量简短,并希望一些编辑可以充实我可能遗漏的细节。

您无需执行任何操作即可将数据视为单个 dask 数组,因为您可以将各个块引用为数组(参见此处),然后使用堆栈/连接函数构建单个数组。不过,这确实意味着打开客户端中的每个文件,以便读取肉类数据。

同样, xarray 具有一些用于读取文件集的功能,您应该能够在其中假设 dtype 和维度的一致性 - 请参阅他们的文档。

就 zarr 而言,您可以使用 dask 在 GCS 上为您创建文件集或不使用,并选择使用与输入相同的分块方案 - 这样就不会有改组。由于 zarr 的设置和理解非常简单,您甚至可以自己创建 zarr 数据集并一个接一个地写入块,而无需从 zarr 文件预先创建 dask 数组。这通常是通过 zarr API 进行的,并且写入一大块数据不需要对元数据文件进行任何更改,因此可以并行完成。理论上,如果您了解低级数据表示(例如,C 数组布局中的 int64),您可以简单地复制一个块;但是,我不知道在原始 hdf 和 zarr 中提供完全相同的压缩机制的可能性有多大(请参阅此处)。


推荐阅读