块大小问题(Dask,xarray,zarr)

时间:2019-05-08 02:12:00

标签: python dask python-xarray zarr

我想将xarray.dataset保存为.zarr文件,但是我无法将自己的块配置为统一的,因此也无法保存。

我已经尝试过:

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

使用数据集时更改块大小。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文件保存为新的块,但是会返回到原始的自动块大小。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 为什么chunks kwarg open_mfdataset的行为不理想:当前,concat_dim上的块固定为每个文件中数据的长度。我也怀疑这就是为什么您的块大小不规则的原因。

  • open_mfdataset将为您完成任务。这是一个很小的时间消耗,但将来需要注意,您可以致电xr.open_mfdataset('/directory/folder/*nc', ...)