xarray с dask sel работает медленно - PullRequest
2 голосов
/ 22 апреля 2019

Серия из около 90 файлов netCDF каждый размером около 27 МБ каждый, открытая с помощью xarray open_mfdataset, занимает много времени для загрузки небольшого пространства-времени.

Размеры порции дают незначительный выигрыш. decode_cf = True либо внутри функции, либо отдельно, также не имеет различий. Другое предложение здесь https://groups.google.com/forum/#!topic/xarray/11lDGSeza78 заставило меня сохранить выделение как отдельный netCdf и перезагрузить его.

Кажется узким местом, когда часть dask должна выполнять какую-то работу (загрузка, вычисления, преобразование в фрейм данных pandas).

Создание графика с помощью dask.visualize создает огромное изображение. Возможно, это нам что-то говорит, но я не знаю, как интерпретировать.

wind = xr.open_mfdataset(testCCMPPath,\
                         decode_cf=True,\
                         chunks={'time': 100,\
                                 'latitude': 100,\
                                 'longitude': 100})
%timeit wind.sel(latitude=latRange, longitude=windLonRange, time=windDateQueryRange).load()

wxr = wind.sel(latitude=latRange, longitude=windLonRange, time=windDateQueryRange)
df = wxr.to_dataframe()
print(df.shape)

вывод времени показывает

1,93 с ± 29,8 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

df.shape вывод только 164x3.

У меня есть аналогичное значение sel для другого массива xr, и я получаю время около 0,05 секунды, однако это имеет много разреженных точек. В массиве wind xr мало пустых мест.

1 Ответ

0 голосов
/ 16 мая 2019

Оказывается, что количество файлов оказалось слишком большим для эффективной работы dask.

Эти файлы имеют размеры широты, долготы и времени. Время в этом случае имеет гранулярность 3 часа. Шкалы времени, в которых я работаю, сделали так, что я работаю с ~ 35000 файлами. Слишком много для работы. Я справился с этим, объединив файлы по годам, уменьшив количество файлов .nc до 12.

CDO (операторы климатических данных) - это утилита, позволяющая быстро объединять файлы. Увидеть [https://www.unidata.ucar.edu/software/netcdf/software.html#CDO][1] для более подробной информации.

Пример того, как я использовал cdo: Для набора файлов в каталоге ./precip/2004 я выполнил команду оболочки для создания объединенного файла netCDF 2004.nc

cdo cat ./precip/2004/*.nc4 2004.nc

Оттуда xr.open_mfdataset () работает намного лучше.

...