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
相关产品推荐
相关产品推荐

