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

Zarr能否像HDF5一样在单个文件中存储多个组和数组?

Zarr可以实现和HDF5类似的单文件存储多个组和数组的需求,你观察到的目录结构是因为Zarr默认使用了DirectoryStore存储后端,只需要切换到单文件对应的存储后端即可。

方案1:使用ZipStore(最常用,兼容通用压缩格式)

ZipStore是Zarr官方原生支持的单文件存储后端,所有的组结构、数组数据都会被写入同一个zip压缩包,使用逻辑和默认目录存储完全一致。
示例代码:

import zarr
from zarr.storage import ZipStore

# 上下文管理器会自动完成资源关闭,避免数据损坏
with ZipStore('group.zarr.zip', mode='w') as store:
    root = zarr.open(store=store, mode='w')
    # 你原有创建组、数组的逻辑不需要做任何修改
    foo = root.create_group('foo')
    bar = foo.create_group('bar')
    z1 = bar.zeros('baz', shape=(10000, 10000), chunks=(1000, 1000), dtype='i4')

执行后会生成单个group.zarr.zip文件,内部包含完整的层级结构和数据,读取时也只需要指定这个zip文件作为存储即可。

方案2:使用SQLiteStore(适合频繁增量修改的场景)

如果你需要对存储的内容做频繁的随机修改、增量写入,ZipStore的压缩包结构需要全量重写会导致性能很低,这时可以选择基于SQLite的SQLiteStore,数据会全部存入单个SQLite数据库文件,支持随机读写。
示例代码:

import zarr
from zarr.storage import SQLiteStore

store = SQLiteStore('group.zarr.db')
root = zarr.open(store=store, mode='w')
# 后续组、数组操作逻辑不变
foo = root.create_group('foo')
bar = foo.create_group('bar')
z1 = bar.zeros('baz', shape=(10000, 10000), chunks=(1000, 1000), dtype='i4')

store.close()

注意事项

  • Zarr的所有存储后端都共用同一套组、数组操作API,你原有针对目录存储编写的业务代码不需要修改,仅需调整存储初始化部分的代码即可
  • 单文件存储相比默认目录存储不支持多进程并发写入,如果有并行写入数据的需求,更推荐使用默认的DirectoryStore
  • ZipStore支持通过compression参数调整zip压缩级别,可根据场景在存储体积和读写性能之间做平衡

内容的提问来源于stack exchange,提问作者maynull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 10:15:04