Построение 2D-данных с использованием Xarray занимает удивительно много времени?
Я читаю файлы NetCDF, используя xarray. Каждая переменная имеет 4 измерения (Times, lev, y, x). После прочтения переменной я вычисляю среднее значение переменной QVAPOR по измерениям (Times, lev). После расчета я получаю переменную QVAPOR_mean, которая является 2D-переменной с формой (y: 699, x: 639).
Xarray потребовалось всего 10 микросекунд, чтобы прочитать данные в форме (Times: 2918, lev: 36, y: 699, x: 639); но потребовалось более 60 минут, чтобы построить заполненный контур данных формы (у: 699, х: 639).
Мне интересно, почему у Xarray очень много времени (более 60 минут), чтобы построить контур массива с размером (y: 699, x: 639).
Я использую следующий код для чтения файлов и выполнения вычислений.
flnm=xr.open_mfdataset('./WRF_3D_2007_*.nc',chunks={'Times': 100})
QVAPOR_mean=flnm.QVAPOR.mean(dim=('Times','lev')
QVAPOR_mean.plot.imshow()
Последняя команда занимает более 60 минут. Помощь приветствуется. Благодарю вас
1 ответ
Когда вы открываете свой набор данных и предоставляете chunks
аргумент, Xarray возвращает Dataset
это состоит из массивов dask. Эти массивы оцениваются "лениво" (документация xarray/dask). Только после того, как вы подготовите свои данные, вычисления будут запущены. Чтобы проиллюстрировать это, вы можете явно загрузить ваши данные после того, как вы взяли среднее значение:
flnm=xr.open_mfdataset('./WRF_3D_2007_*.nc',chunks={'Times': 100})
QVAPOR_mean=flnm.QVAPOR.mean(dim=('Times','lev').load()
Теперь ваш QVAPOR_mean
Переменная поддерживается массивом NumPy вместо массива DASK. Построение этого массива, вероятно, будет намного быстрее.
Тем не менее, вычисление вашего mean
вероятно, все еще займет довольно много времени. Здесь также есть способы улучшить пропускную способность.
Попробуйте использовать больший размер куска. Я часто нахожу, что размеры чанков в диапазоне 10-100 Мб работают лучше всего.
Попробуйте другой планировщик. По умолчанию вы используете поточный планировщик Dask. Из-за ограничений с netCDF/HDF это не позволяет выполнять параллельное чтение с диска. Мы обнаружили, что
distributed
Планировщик хорошо работает для этих приложений.