Запись Dask / XArray в NetCDF - параллельный ввод-вывод - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Dask / Xarray с набором данных ~ 150 ГБ в распределенном кластере в системе HPC.У меня есть завершенный компонент вычисления, который занимает около 30 минут.Я хочу сохранить окончательный результат в файл NETCDF4, но запись данных в файл NETCDF выполняется довольно медленно (~ 3 часа) и, кажется, не работает параллельно.Мне неясно, должна ли функция to_netcdf в Xarray поддерживать параллельные записи.В настоящее время мой подход состоит в том, чтобы написать пустой файл netcdf с NetCDF4, а затем добавить данные из 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?Если так, что я делаю неправильно?

Спасибо!

...