You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无编码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:20