chunksize 的问题(Dask、xarray、zarr)

Problems with chunksize (Dask, xarray, zarr)

我想将一个 xarray.dataset 保存为 .zarr 文件,但我无法将我的块配置为统一的,它不会保存。

我试过了:

使用 xarray.open_mfdataset 时更改块大小 -> 它仍然使用不起作用的自动块。

使用 dataset.chunk(n) 时更改块大小 -> 打开数据集时仍然指自动块。

代码:

import xarray as xr
import glob
import zarr

local_dir = "/directory/"
data_dir = local_dir + 'folder/'

files = glob.glob(data_dir + '*.nc')
n = 1320123
data_files = xr.open_mfdataset(files,concat_dim='TIME',chunks={'TIME': n}) # does not specify chunks, uses automatic chunks
data_files.chunk(n) # try modifying here, still uses automatic chunks
data_files.to_zarr(store=data_dir + 'test.zarr',mode='w') # I get an error about non-uniform chunks - see below

ValueError: Zarr requires uniform chunk sizes except for final chunk. Variable dask chunks ((1143410, 512447, 1170473, 281220, 852819),) are incompatible. Consider rechunking using chunk().

我希望 .zarr 文件保存新的块,但会返回原始自动块大小。

Xarray 的 Dataset.chunk 方法 return 一个新的数据集,因此您需要更多类似的东西:

ds = xr.open_mfdataset(files, concat_dim='TIME').chunk({'TIME': n})
ds.to_zarr(...)

其他一些需要注意的细节:

  • 为什么 chunks kwarg open_mfdataset 没有按预期运行:目前,concat_dim 中的块固定为每个文件中的数据长度.我也怀疑这就是为什么你有不规则块大小的原因。

  • open_mfdataset 会为你做 glob。这是一个小时间的享受,但以后有什么需要注意的,你可以调用xr.open_mfdataset('/directory/folder/*nc', ...)