0

我想将 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 需要统一的块大小,最终块除外。可变 dask 块 ((1143410, 512447, 1170473, 281220, 852819),) 不兼容。考虑使用chunk().

我希望 .zarr 文件与新块一起保存,但会引用原始自动块大小。

4

1 回答 1

2

Xarray 的Dataset.chunk方法返回一个新的数据集,所以你需要更多类似的东西:

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

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

  • 为什么chunkskwarg的open_mfdataset行为不如预期:目前,沿 的块concat_dim固定为每个文件中的数据长度。我也怀疑这就是为什么你有不规则的块大小。

  • open_mfdataset会为你做这件事。这是一个小小的时间品味,但将来需要注意的事情,你可以打电话给xr.open_mfdataset('/directory/folder/*nc', ...)

于 2019-05-08T02:55:07.920 回答