【问题标题】:zarr not respecting chunk size from xarray and reverting to original chunk sizezarr 不考虑来自 xarray 的块大小并恢复为原始块大小
【发布时间】:2021-05-10 19:22:15
【问题描述】:

我正在打开一个 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

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

【问题讨论】:

    标签: python python-xarray zarr


    【解决方案1】:

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

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

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

    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
    

    【讨论】:

    • 谢谢!!这很有效,我会密切关注这个拉取请求,看看它在未来会如何变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多