Проблемы с кусками (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 требует одинакового размера чанка, за исключением окончательного чанка. Куски переменной переменной ((1143410, 512447, 1170473, 281220, 852819),) несовместимы. Рассмотрите возможность повторного использования chunk(),

Я ожидаю, что файл.zarr сохранится с новыми чанками, но ссылается на оригинальные автоматические размеры чанков.

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', ...),

Другие вопросы по тегам