Проблемы с кусками (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
kwargopen_mfdataset
не ведет себя так, как хотелось бы: в настоящее время куски вдольconcat_dim
фиксируются на длину данных в каждом файле. Я также подозреваю, что именно поэтому у вас неправильный размер куска.open_mfdataset
сделает шарик для вас. Это небольшой запах времени, но кое-что стоит отметить в будущем, вы можете просто позвонитьxr.open_mfdataset('/directory/folder/*nc', ...)
,