Zarr

5天前发布 5 00

Zarr 是一个用于存储 N 维数组的强大库,支持分块、压缩及多种后端,使其成为科学计算和大规模数据处理中极具通用性的选择。

所在地:
美国
收录时间:
2026-01-05
其他站点:

当数据规模超过内存容量时,传统的 NumPy 数组会因“一次性加载”模式而崩溃。Zarr 正是为解决这一问题而设计的开源库,它通过分块存储、按需读取和灵活后端支持,让 Python 能够高效处理 GB 甚至 TB 级别的 N 维数组。

为什么需要 Zarr?

NumPy 是科学计算的基石,但它假设整个数组可驻留内存。一旦数据量达到千兆字节级别,内存溢出(MemoryError)便难以避免。虽然内存映射(np.memmap)提供了一种替代方案,但它在云存储、并行访问和压缩支持方面存在局限。

Zarr

Zarr 的核心思想是:不加载全部数据,只读取所需部分

核心特性

  • 分块存储(Chunking)
    数据被划分为独立的小块(chunks),读取时仅加载相关块,显著降低内存占用。
  • 内置压缩
    每个块可独立压缩(如 Blosc、Zstandard、GZIP),减少存储空间,且仅解压实际读取的块
  • 多后端支持
    可将数据存储于本地文件系统、内存、S3、Google Cloud Storage、Azure Blob 等,无需修改代码逻辑。
  • 兼容 NumPy 语义
    API 设计高度模仿 NumPy,切片、赋值、形状操作等几乎一致,学习成本极低。
  • 高性能 I/O
    支持异步读写、多线程与并行处理,可与 DaskXarray 等库无缝集成,用于分布式计算。
  • 跨版本兼容
    同时支持 Zarr v2 与 v3 规范,确保长期数据可读性。

快速上手

安装

pip install zarr
# 或
conda install --channel conda-forge zarr

(需 Python 3.11+)

创建并保存数组

import zarr
import numpy as np

# 生成大型数组
data = np.random.rand(10_000, 1_000)

# 创建 Zarr 数组(分块大小 1000×1000)
z = zarr.open(
    "example.zarr",
    mode="w",
    shape=data.shape,
    chunks=(1_000, 1_000),
    dtype=data.dtype,
    compressor=zarr.Blosc(cname='zstd', clevel=3)
)

# 写入数据
z[:] = data

按需读取

# 仅加载 10 行数据,不加载整个数组
subset = z[1000:1010, :]

语法与 NumPy 完全一致,但内存消耗仅与所选切片成正比。

何时使用 Zarr?

✅ 推荐场景

  • 数据集 > 内存容量(GB/TB 级别)
  • 需频繁访问局部区域(如时间序列切片、图像子区域)
  • 数据存储于云对象存储(S3、GCS 等)
  • 需要并行或分布式处理(配合 Dask)
  • 科学计算、遥感、生物成像、气候模拟等领域

❌ 不推荐场景

  • 小型数组(< 1 GB),NumPy 已足够高效
  • 无需持久化存储的临时计算
  • 对启动延迟极度敏感的实时系统

与其他格式对比

特性ZarrHDF5/netCDFNumPy .npy
分块✅ 原生支持✅(HDF5)
云存储✅(通过 fsspec)⚠️ 有限支持
并行读写⚠️ 有限
压缩✅ 块级压缩
API 熟悉度✅ 类 NumPy⚠️ 需学习新接口

Zarr 在云原生、可扩展性与易用性之间取得了良好平衡。

数据统计

相关导航

暂无评论

none
暂无评论...