Требуется 21 секунда для запуска xarray.DataArray.values
для набора данных, который я открыл с помощью open_mfdataset()
.
Получение значений из большего массива, который я открыл с помощью open_dataset()
, происходит в 1000 раз быстрее,РЕДАКТИРОВАТЬ: цикл по нескольким файлам с помощью цикла for также намного быстрее, чем при использовании open_mfdataset()
. См. Правку внизу.
Не могли бы вы помочь мне понять, почему это происходит или что искать, и если есть более быстрый способ открыть 40 netCDF, сделать выбор и экспортировать выбранныйданные для numpy?
Мой код выглядит следующим образом:
ds = xr.open_mfdataset(myfiles_list, concat_dim='new_dim')
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
vals = ds['temperature'].values # this line takes 18.9 secs
# total time: 21 secs
# vals.shape = (40, 1, 26, 17)
против
onefile = xr.open_dataset('/path/to/data/single_file.nc')
vals = onefile['temperature'].values # this line takes 0.005 secs
# total time: 0.018 secs
# vals.shape = (93, 40, 26, 17)
Спасибо.
EDIT - ExtraИнформация:
Я должен уточнить, что, похоже, медленная загрузка. Когда values
вызывается массив, который ранее был ленивым, загружается . Если я вставлю явную команду load()
, тогда загрузка будет медленной, но команда значений будет быстрой:
ds = xr.open_mfdataset(myfiles_list, concat_dim='new_dim')
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
ds = ds.load() # this line takes 19 secs
vals = ds['temperature'].values # this line takes <10 ms
# total time: 21 secs
# vals.shape = (40, 1, 26, 17)
Если вместо использования open_mfdataset()
я выполню цикл for для своего списка файлов, извлеките массив numpy из каждого из них и выполните объединение в numpy, тогда это займет всего 1 секунду. В этом MWE это решает всю мою проблему, но в моем полном коде мне нужно использовать open_mfdataset()
:
list_of_arrays = []
for file in myfiles_list:
ds = xr.open_dataset(file)
ds = ds.sel(time=selected_date)
ds = ds.sel(latitude=slice([ymin, ymax]), longitude=slice([xmin, xmax]))
list_of_arrays.append(ds['temperature'].values)
vals = np.concatenate(list_of_arrays, axis=0)
# total time: 1.0 secs
# vals.shape = (40, 26, 17)