Запись массива dask в netcdf - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь записать массив dask в файл netcdf и получаю сообщение об ошибке памяти, которое я нахожу немного странным, поскольку размер массива dask не слишком велик.Это около 0,04 ГБ.Его размерность следующая:

    <xarray.Dataset>
    Dimensions:    (latitude: 2000, longitude: 5143)
    Coordinates:

    * latitude   (latitude) float64 -29.98 -29.93 -29.88 -29.83 -29.78 -29.73 ...

    * longitude  (longitude) float64 -180.0 -179.9 -179.9 -179.8 -179.8 -179.7 ...

    Data variables:Tmax   (latitude, longitude) float32 

    **dask.array shape=(2000, 5143), chunksize=(2000, 5143)**

Я также попытался выполнить повторный анализ, и это тоже не помогает.Пожалуйста, дайте мне знать, если у вас есть какие-либо советы.Спасибо!

Вот как я генерирую массив dask для записи в netcdf.

    DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True)
    MONTH_MEAN = DATA.mean(dim='Month')

    DIFF_MEAN = ((MONTH_MEAN.isel(time=np.arange(17, 34))).mean(dim='time') -
    (MONTH_MEAN.isel(time=np.arange(17)))).mean(dim='time')

    OUTFILE = OUTFILE_template.format(CHIRTS_INDIR, DATA_LIST[c])

    DIFF_MEAN.to_netcdf(OUTFILE) 

Размер DATA - исходный массив dask, который содержит данные из всех входных файлов,это:

   <xarray.Dataset>

   Dimensions:    (Month: 12, latitude: 2000, longitude: 5143, time: 34)

   Coordinates:
   * latitude   (latitude) float64 -29.98 -29.93 -29.88 -29.83 -29.78 -29.73 ...
   * longitude  (longitude) float64 -180.0 -179.9 -179.9 -179.8 -179.8 -179.7 ...
   * time       (time) datetime64[ns] 1983-12-31 1984-12-31 1985-12-31 ...

   Dimensions without coordinates: Month

   Data variables:
   Tmax       (Month, time, latitude, longitude) 
   float32 dask.array<shape=(12, 34, 2000, 5143), 
   chunksize=(1, 34, 2000, 5143)>

1 Ответ

0 голосов
/ 23 мая 2018

Каждый кусок массива в вашем наборе данных содержит 34*2000*5143*4/1e9 = 1.4 GB данных.Это довольно много для работы с массивами dask.Как правило, вы хотите иметь возможность хранить что-то вроде 5-10 блоков массива в памяти за одно ядро ​​процессора.Меньшие куски (~ 100 МБ), вероятно, ускорят ваши вычисления и уменьшат требования к памяти.См. здесь для получения дополнительных рекомендаций по размерам чанков.

Чтобы настроить размеры чанков с помощью xarray / dask, используйте аргумент chunks= в open_mfdataset, например,

DATA = xr.open_mfdataset(INFILE, concat_dim='Month', autoclose=True,
                         chunks={'latitude': 1000, 'longitude': 1029})
...