气象领域的数据存储格式大多都是netCDF、HDF、Grib格式,这些文件格式已经发展的比较成熟了,大家也都已经习惯了处理这些格式的文件。但随着数据量的增加以及云计算的发展,这些文件系统已经无法满足需求,针对云计算优化的文件系统应运而生。
Zarr 是一种存储分块、压缩的N维数组格式。由于 Zarr 格式比 NetCDF4/HDF5 格式具有更快的处理速度,已经在云平台得到较为广泛的应用。近几年在国外地球科学领域也得到了广泛关注。
Unidata在2019年开始在netCDF-C中引入Zarr支持,并从4.8.0版本开始正式支持Zarr,命名为NCZarr。
已有相关人员测试了通过netCDF和Zarr两种方式处理NOAA在AWS的GOES卫星数据并进行绘图的效率,结果发现:使用Zarr格式比netCDF格式效率提高非常明显。
Zarr和NetCDF格式效率对比
之前也大概了解过 Zarr,之所以要专门介绍 Zarr 是因为在处理数据的过程中,由于需要进行大文件读写操作,而使用 NetCDF 格式写入数据时速度很慢,并且为了避免对文件进行分割实现文件的并行读写,便尝试了Zarr。
在初步尝试时,使用 Zarr 格式写入数据时比使用 xarray 写入 NetCDF 文件快了 2 倍(未进行数据压缩)。在对数据压缩时,Zarr 格式比 NetCDF 格式的写入速度快了差不多 6 倍,从 184 秒降为 31 秒。数据的存储效率提升非常明显,而且存储空间也有所降低。
总的来说,相比于 NetCDF 和 HDF5 而言, Zarr 尚处于完善阶段,仍不成熟。但在未来数据上云的情况下,Zarr还是有不错的发展前景。
Zarr主要具有以下特点:
可直接通过 pip 进行安装
pip install zarr
或者通过 conda 进行安装
conda install -c conda-forge zarr
或通过github安装最新开发版本
pip install git+https://github.com/zarr-developers/zarr-python.git
xarray中提供了非常方便的Zarr格式的读写方法,通过 xr.open_zarr
和 xr.to_zarr
函数可以实现对 Zarr 格式的读写操作。值得注意的是:xarray 不支持通过 netCDF 格式的增量写文件,支持 Zarr 格式的增量写文件。增量读写在一些场景下是非常关键的,尤其是在数据集较大内存不足的情况下。
Zarr官方文档提供了更为详细的使用说明,这里就不多说了,以后有更具体的使用场景再展开。感兴趣的可以去看一下。
对于课题组或个人而言,对文件读写也有较高要求的可以尝试。如果对如果是对文件读写有较高要求的业务部门可以尝试采用Zarr格式来进一步改善效率,但是要注意目前Zarr尚未发展成熟,关键业务仍不建议采用Zarr,除非部门有对文件IO部分特别熟悉的,有备份补救措施。
又是一篇没有什么代码的推送~ 看了一些机构的测试结果,总的来说,不管你是否需要上云,都可以使用 Zarr。在大量文件读写方面我已经逐渐转向 Zarr 了,后续可能也会更新一些这方面的推送,毕竟目前xarray在文件并行读写方面Zarr的支持比netCDF要好一些。
参考链接:
1. https://zarr.readthedocs.io/en/stable/
2. https://www.unidata.ucar.edu/blogs/news/entry/netcdf-and-native-cloud-storage
3. https://www.unidata.ucar.edu/blogs/developer/en/entry/netcdf-zarr-data-model-specification
4. https://www.unidata.ucar.edu/blogs/developer/entry/overview-of-zarr-support-in
5. https://nbviewer.jupyter.org/github/oceanhackweek/ohw20-tutorials/blob/master/10-satellite-data-access/goes-cmp-netcdf-zarr.ipynb
—END—