为何无编码的xarray生成Zarr文件占用空间小于实际数据量?
关于xarray存储Zarr与netCDF无编码时文件大小差异的疑问
我正在测试用xarray以netCDF或Zarr格式存储N维数组的方案,以及两种格式提供的各类编码选项。在我的数据和系统环境下,Zarr整体表现优于netCDF,但存储后的文件大小出现了意外情况。
以下是最小可复现示例(MWE),生成的xarray.Dataset大小为16793600字节:
import numpy as np import xarray as xr import zarr # 版本信息(Python 3.11.6) print(np.__version__) # 1.26.0 print(xr.__version__) # 2023.10.1 print(zarr.__version__) # 2.16.1 rng = np.random.default_rng(0) t = 10 ds = xr.Dataset( data_vars=dict( A=(["y", "x"], rng.normal(size=(2**t,2**t))), B=(["y", "x"], rng.normal(size=(2**t,2**t))), ), coords=dict( x=(["x"], np.linspace(0, 1, 2**t)), y=(["y"], np.linspace(0, 1, 2**t)), ), ) print(f'{ds.nbytes}') # 16793600 # 存储为netCDF,使用不同引擎 ds.to_netcdf('file1.nc', engine='netcdf4', encoding=None) ds.to_netcdf('file2.nc', engine='scipy', encoding=None) ds.to_netcdf('file3.nc', engine='h5netcdf', encoding=None) # 存储为Zarr ds.to_zarr('file.zarr', encoding=None)
生成的文件大小如下:
$ du -bs file* 16801792 file1.nc 16793952 file2.nc 16801792 file3.nc 16017234 file.zarr
可以看到Zarr文件更小,比netCDF文件少了近800KB。我设置了encoding=None,原本以为这代表“不使用压缩”。这个差距在小数据集上看似微小,但我处理的38GB数据集,在同样encoding=None的设置下,netCDF4或h5netcdf引擎生成的文件是38GB(scipy引擎意外失败),而Zarr文件仅为16GB,是前者的一半!
我有以下疑问:
- 未指定编码的情况下,Zarr文件为什么能大幅缩小?Zarr或xarray在底层做了什么?
- 如果确实使用了压缩,有没有办法禁用它?
- 我注意到这类大型Zarr文件的读写速度更快,但占用内存比netCDF文件更多,这和上述的文件大小差异有关吗?
内容的提问来源于stack exchange,提问作者adriaat
相关产品推荐
相关产品推荐

