用途
Zarr 是一个 Python 库,用于存储带分块与压缩的大规模 N 维数组。它面向高效并行 I/O、云原生工作流,以及与 NumPy、Dask、Xarray 的无缝集成。
安装
使用以下命令安装:
uv pip install zarr
需要 Python 3.11+。如需云存储支持,还需安装额外包:
uv pip install s3fs # For S3
uv pip install gcsfs # For Google Cloud Storage
主要能力
数组创建与读写
Zarr 提供多种便捷函数创建数组,例如 zarr.zeros、zarr.ones、zarr.full、zarr.array、zarr.zeros_like,也支持通过 zarr.create_array 指定 store、shape、chunks、dtype 创建。索引方式与 NumPy 类似,支持整数组写入、切片写入与读取,并提供 vindex、oindex、blocks 等高级索引方式,以及 resize 与 append 调整和追加数据。
分块(Chunking)
分块对性能至关重要。建议最小分块约 1 MB;大分块减少元数据操作,小分块利于并行访问;压缩时整个分块需能放入内存。分块形状应贴合访问模式:按行访问时让分块跨列,按列访问时让分块跨行,混合访问可采用方形分块。文档中给出示例:对于 (200, 200, 200) 的数组,按第一维读取时,使用 chunks (1, 200, 200) 约 107ms,而使用 chunks (200, 200, 1) 约 1.65ms,相差约 65 倍。
分片(Sharding)
当数组包含数百万个小分块时,可用分片把多个分块合并为更大的存储对象,减少文件系统开销、提升云存储性能并避免文件系统块大小浪费。可使用 ShardingCodec 配合 BytesCodec、BloscCodec 配置。注意整个分片必须在写入前放入内存。
压缩
Zarr 按分块压缩。默认使用 Blosc(Zstandard)。可通过 BloscCodec 配置 cname(如 'blosclz'、'lz4'、'lz4hc'、'snappy'、'zlib'、'zstd')、clevel、shuffle;也可使用 GzipCodec 或 BytesCodec(不压缩)。文档给出的性能提示:Blosc(默认)压缩解压快、适合交互式负载;Zstandard 压缩比更好、略慢于 LZ4;Gzip 压缩率最高但较慢;LZ4 最快但压缩比较低;对数值数据启用 shuffle 可提升压缩效果。
存储后端
支持本地文件系统(LocalStore,默认,也可直接用字符串路径)、内存(MemoryStore,不持久化)、ZIP 文件(ZipStore,使用后必须 close())、云存储(通过 s3fs.S3Map 使用 S3,通过 gcsfs.GCSMap 使用 Google Cloud Storage)。云存储建议:使用合并元数据(zarr.consolidate_metadata)降低延迟;分块大小对齐云对象尺寸(通常 5–100 MB 较优);用 Dask 实现并行写入;考虑分片以减少对象数量。
组与层级
组(Group)可像目录或 HDF5 组那样组织多个数组。可用 zarr.group 创建根组,用 create_group 创建子组,用 create_array 在组内创建数组,用路径访问(如 root['temperature/t2m']),并用 root.tree() 可视化层级。还提供 h5py 兼容接口,如 create_dataset、require_group、require_dataset。
属性与元数据
可通过 attrs 为数组和组附加自定义元数据,属性以 JSON 形式存储,因此必须可 JSON 序列化(字符串、数字、列表、字典、布尔值、null)。
与 NumPy、Dask、Xarray 集成
Zarr 数组实现 NumPy 数组接口,可直接使用 NumPy 函数并转换回 NumPy 数组。Dask 提供对 Zarr 数组的惰性、并行计算,可用 da.from_zarr 读取、da.to_zarr 写入,实现超大内存数据集处理和按分块自动并行。Xarray 通过 xr.open_zarr 与 ds.to_zarr 提供带标签的多维数组与 NetCDF 风格的接口,支持命名维度、坐标、基于标签的索引以及与 pandas 的集成。
并行计算与同步
提供 ThreadSynchronizer(多线程写入)与 ProcessSynchronizer(多进程写入)。并发读取无需同步;只有当写入可能跨越分块边界时才需要同步;各进程/线程写入不同分块无需同步。对于包含大量数组的层级存储,可合并元数据(consolidate_metadata 后使用 open_consolidated),把元数据读取次数从每个数组一次降为一次,对云存储尤为关键。需注意:数组更新后未重新合并会使元数据过时,不适合频繁更新的数据集,多写入者场景可能出现不一致读取。
性能优化与调试
优化清单包括:分块大小以 1–10 MB 为宜;分块形状对齐访问模式;按负载选择压缩;按环境选择存储后端;大规模数据集使用分片;大数据操作使用 Dask 并行 I/O。可用 print(z.info) 查看类型、形状、分块、dtype、压缩编解码与级别、存储大小与位置,并可用 z.nbytes_stored、z.nbytes 计算压缩比。
使用方式与适用场景
典型模式包括:时间序列数据以时间为第一维、每块一个时间步以便高效追加;大型矩阵运算借助 Dask 并行计算;云原生工作流写入 S3 并按云存储要求分块。适用场景包括大规模科学计算、气候与地理空间数据、需要超出内存的数据集处理以及云上并行 I/O 工作流。
限制
Zarr 需要 Python 3.11+;云存储需额外安装 s3fs 或 gcsfs;ZipStore 使用后必须关闭;分块与分片在压缩/写入前需能放入内存;属性必须可 JSON 序列化;合并元数据不适合频繁更新的数据集且在多写入者场景可能不一致。文档未提供收费或价格信息。