xarray load () медленно работает с данными open_mfdataset () - PullRequest
0 голосов
/ 04 октября 2019

Требуется 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)

1 Ответ

0 голосов
/ 07 октября 2019

xarray.open_mfdataset создаст список Python из xarray.Datasets и объединит их после того, как все файлы будут проанализированы в списке.
Таким образом, несколько раз данные должны быть открыты и сохранены в списке. Если вы профилируете код, вы поймете, что анализ файла занимает больше времени, но не соотносится с размером файла. Таким образом, в 2 раза больший файл не займет в 2 раза больше времени для анализа. В конце концов, сама конкатенация требует времени.

...