1

我正在打开一个 zarr 文件,然后将其重新分块,然后将其写回另一个 zarr 商店。然而,当我打开它备份它不尊重我之前写的块大小。这是 jupyter 的代码和输出。知道我在这里做错了什么吗?

bathy_ds = xr.open_zarr('data/bathy_store')
bathy_ds.elevation

在此处输入图像描述

bathy_ds.chunk(5000).elevation

在此处输入图像描述

bathy_ds.chunk(5000).to_zarr('data/elevation_store')
new_ds = xr.open_zarr('data/elevation_store')
new_ds.elevation

在此处输入图像描述

它正在恢复到原始分块,就好像我没有完全覆盖它或更改一些需要更改的其他设置一样。

4

1 回答 1

7

这似乎是一个已知问题,并且在该问题的线程和最近合并的 PR中进行了相当多的讨论。

.encoding基本上,数据集在属性中携带原始分块。因此,当您调用第二次写入操作时,ds[var].encoding['chunks'](如果存在)中定义的块将用于写入varzarr。

根据 GH issue 中的对话,目前最好的解决方案是手动删除有问题的变量的块编码:

for var in ds:
    del ds[var].encoding['chunks']

但是,应该注意的是,这似乎是一个不断变化的情况,最好检查进度以适应最终解决方案。

这是一个展示问题和解决方案的小示例:

import xarray as xr

# load data and write to initial chunking 
x = xr.tutorial.load_dataset("air_temperature")
x.chunk({"time":500, "lat":-1, "lon":-1}).to_zarr("zarr1.zarr")

# display initial chunking
xr.open_zarr("zarr1.zarr/").air

在此处输入图像描述

# rechunk
y = xr.open_zarr("zarr1.zarr/").chunk({"time": -1})

# display
y.air

在此处输入图像描述

#write w/o modifying .encoding
y.to_zarr("zarr2.zarr")

# display
xr.open_zarr("zarr2.zarr/").air

在此处输入图像描述

# delete encoding and store
del y.air.encoding['chunks']
y.to_zarr("zarr3.zarr")

# display
xr.open_zarr("zarr3.zarr/").air

在此处输入图像描述

于 2021-05-11T08:45:00.407 回答