首页 > 解决方案 > 将 Dask/XArray 写入 NetCDF - 并行 IO

问题描述

我在 HPC 系统的分布式集群上使用 Dask/Xarray 和 ~150 GB 数据集。我已经完成了计算组件,大约需要 30 分钟。我想将最终结果保存到 NETCDF4 文件,但是将数据写入 NETCDF 文件非常慢(约 3 小时),而且似乎不能并行运行。我不清楚 Xarray 中的“to_netcdf”函数是否应该支持并行写入。目前我的方法是用 NetCDF4 编写一个空的 netcdf 文件,然后附加 Xarray 中的数据:

f_mosaic = 't1.nc'

meta = {'width': dat_f.shape[1],
        'height': dat_f.shape[2],
        'crs': rasterio.crs.CRS(init='epsg:'+fi['CPER']['Reflectance']['Metadata']['Coordinate_System']['EPSG Code'].value.decode("utf-8")),
        'transform': aff_final,
        'count': dat_f.shape[0]}

with netCDF4.Dataset(f_mosaic, mode='w', format="NETCDF4") as t1:
    # Create spatial dimensions
    y = t1.createDimension('y', meta['width'])
    x = t1.createDimension('x', meta['height'])
    wl_dim = t1.createDimension('wl',meta['count'])
    reflectance = t1.createVariable("reflectance","int16",("wl","y","x",),fill_value=null_val,zlib=True)
    reflectance.setncattr('grid_mapping', 'crs')
    crs = t1.createVariable('crs', 'c')
    crs.spatial_ref = meta['crs'].wkt
    crs.epsg_code = meta['crs'].to_string()
    crs.GeoTransform = " ".join(str(x) for x in meta['transform'].to_gdal())

dat_f.to_netcdf(path=f_mosaic,mode='a',format='NETCDF4',encoding={'reflectance':{'zlib':True}})

总的来说,问题是,如何快速将这些数据写入 NETCDF4 文件?dask/Xarray 是否支持 NETCDF4 的并行写入?如果是这样,我做错了什么?

谢谢!

标签: dasknetcdfpython-xarraydask-distributednetcdf4

解决方案


推荐阅读