Я работаю с набором из 468 файлов netcdf общим размером до 12 ГБ. Каждый файл имеет только один глобальный снимок геофизической переменной, т.е. для каждого файла форма данных (1, 1801, 3600)
соответствует размерам ('time', 'latitude', 'longitude')
.
Моя оперативная память составляет 8 ГБ, поэтому мне нужно разбить ее на части. Я создаю набор данных xarray, используя xarray.open_mfdataset
, и обнаружил, что использование блока параметров при вызове xarray.open_mfdataset
или повторном преобразовании после метода .chunk
дает совершенно разные результаты. Об аналогичных проблемах сообщалось здесь, не получив ответа.
Из документации xarray чанкинг при вызове xarray.open_dataset
или повторном чанковании с .chunk
должны быть точно эквивалентными ...
http://xarray.pydata.org/en/stable/dask.html
... но это не так. Поделюсь здесь своими примерами.
import xarray as xr
data1 = xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
concat_dim='time', combine='nested',
chunks = {'longitude':400, 'latitude':200}) \
.chunk({'time':-1})
data1.t2m.data
with ProgressBar():
data1.std('time').compute()
[########################################] | 100% Completed | 5min 44.1s
В этом случае все работает нормально.
2) ИЗМЕРЕНИЕ МЕТОДОМ .chunk
ПО ПРОСТРАНСТВЕННЫМ ИЗМЕРЕНИЯМ (долгота, широта) БЕЗ РАЗРЕШЕНИЯ ВРЕМЕНИ.
data2=xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
concat_dim='time',combine='nested') \
.chunk({'time': -1, 'longitude':400, 'latitude':200})
data2.t2m.data
Как показано на этом изображении, очевидно, что теперь фрагменты точно такие же, как в 1). Тем не мение...
with ProgressBar():
data2.std('time').compute()
[##################################### ] | 93% Completed | 1min 50.8s
... вычисление std не могло завершиться, ядро ноутбука jupyter умерло без сообщения из-за превышения лимита памяти, поскольку я мог проверить мониторинг с помощью _14 _... Это, вероятно, означает, что разбиение на части действительно не происходило, и все набор данных без фрагментов загружается в память.
3) РАЗДЕЛЕНИЕ ПРИ ВЫЗОВЕ xarray.open_mfdataset
ПО ПРОСТРАНСТВЕННЫМ ИЗМЕРЕНИЯМ (долгота, широта) И ОСТАВЛЕНИЕ ИЗМЕРЕНИЯ ВРЕМЕНИ, РАЗБИРАЕМОГО ПО УМОЛЧАНИЮ (ОДИН ФАЙЛ НА ФАЙЛ).
Теоретически этот случай должен быть намного медленнее, чем 1), поскольку вычисление std
выполняется по временному измерению, и, таким образом, гораздо больше фрагментов генерируется без необходимости (сейчас 421420 фрагментов против 90 фрагментов в (1)).
data3 = xr.open_mfdataset('/data/cds_downloads/2m_temperature/*.nc',
concat_dim='time', combine='nested',
chunks = {'longitude':400, 'latitude':200})
data3.t2m.data
with ProgressBar():
data3.std('time').compute()
[########################################] | 100% Completed | 5min 51.2s
Однако проблем с памятью нет, и время, необходимое для вычислений, почти такое же, как в случае 1). Это снова говорит о том, что метод .chunk
, похоже, не работает должным образом.
Кто-нибудь знает, имеет ли это смысл или как решить эту проблему? Мне нужно было бы иметь возможность изменять фрагменты в зависимости от конкретных вычислений, которые мне нужно выполнить.
Спасибо
PD: Я использую xarray версии 0.15.1