Типичный рабочий процесс вычислений для xarray обычно включает в себя:
xr.open_mfdataset
или xr.open_dataset(chunks=...)
Чтение нескольких файлов из одного файла в Dataset
to_netcdf
方法保存结果上述步骤通常会产生很大的ncдокумент(>10G),Особенно при работе с большими объемами данных. Недавно при обработке спутниковых данных,Окончательный сгенерированный файл даже превысил 50 ГБ.,Некоторые даже превышают 100G. В настоящее время xarray является головной болью для больших файлов в формате nc. Обработка таких больших файлов занимает много времени.,Это может даже привести к зависанию программы.
Чтобы избежать вышеперечисленных проблем,можно использоватьxr.save_mfdataset
,Может одновременно хранить несколько объектов набора данных. Инструкции по этой функции можно найти в официальной документации.
Сначала импортируйте необходимые библиотеки:
import xarray as xr
import numpy as np
from distributed import Client, performance_report
затем создайтеClient
объект,Построить локальноcluster
:
client = Client()
Многопроцессный кластер, созданный dask
Приведенная выше информация будет отличаться для разных машин и настроек параметров.
Затем загрузите набор данных:
ds = xr.tutorial.open_dataset('rasm', chunks={'time': 12})
Этот набор данных представляет собой образец данных, официально предоставленный xarray. Размер блока установленного здесь измерения времени равен 12. Затем выполните соответствующие расчетные операции с приведенным выше набором данных:
result = np.sqrt(np.sin(ds) ** 2 + np.cos(ds) ** 2)
В процессе расчета используется dask. Вы можете выполнить следующую инструкцию, чтобы просмотреть график расчета:
result.Tair.data.visualize()
Схема расчета Dask, нажмите, чтобы увидеть увеличенное изображение
После завершения расчета, чтобы сохранить файл NC параллельно, приведенные выше результаты необходимо разделить на несколько объектов:
Создайте функцию разделения, чтобы разделить указанный выше объект набора данных на несколько объектов поднабора данных:
import itertools
def split_by_chunks(dataset):
chunk_slices = {}
for dim, chunks in dataset.chunks.items():
slices = []
start = 0
for chunk in chunks:
if start >= dataset.sizes[dim]:
break
stop = start + chunk
slices.append(slice(start, stop))
start = stop
chunk_slices[dim] = slices
for slices in itertools.product(*chunk_slices.values()):
selection = dict(zip(chunk_slices.keys(), slices))
yield dataset[selection]
Разделить объекты:
datasets = list(split_by_chunks(result))
Каждый элемент возвращаемого результата соответствует каждому фрагменту объекта набора данных xarray.
Затем необходима функция для создания пути для каждого разделенного объекта набора данных:
def create_filepath(ds, prefix='filename', root_path="."):
"""
Generate a filepath when given an xarray dataset
"""
start = ds.time.data[0].strftime("%Y-%m-%d")
end = ds.time.data[-1].strftime("%Y-%m-%d")
filepath = f'{root_path}/{prefix}_{start}_{end}.nc'
return filepath
Сначала выполните вышеуказанную функцию на объекте набора данных, чтобы проверить, может ли функция работать нормально:
create_filepath(datasets[1])
Следующий шаг — создать путь для каждого объекта набора данных для сохранения данных:
paths = [create_filepath(ds) for ds in datasets]
наконец,Сразуможно использоватьxr.sace_mfdataset
Параллелизм функцийхранилищеncдокумент Понятно:
xr.save_mfdataset(datasets=datasets, paths=paths)
После сохранения данных вы можете проверить, соответствуют ли результаты, хранящиеся параллельно, результатам, хранящимся отдельно.
Чтение сохраненных данных:
new_ds = xr.open_mfdataset(paths, combine='by_coords')
Затем сравните с результатами приведенного выше расчета:
try:
xr.testing.assert_identical(result, new_ds)
except AssertionError:
print('The datasets are not identical!')
else:
print('The datasets are identical!')
Операция записи netCDF всегда была болевой точкой для xarray, особенно с точки зрения параллельной записи и инкрементной записи файлов. Другой формат файла был представлен ранее Может ли Zarr действительно заменить NetCDF4 и HDF5?,Очень дружелюбен с точки зрения параллельной и инкрементальной записи файлов.,Особенно, когда речь идет о больших файлах.
В настоящее время новая версия библиотеки netCDF постепенно поддерживает формат zarr, но эффект еще не проверен. Если вам не обязательно использовать формат netCDF, вы можете попробовать использовать формат zarr.
Послесловие: Хотя в этой статье используется dask, в нем относительно мало контента. Недавно я использовал dask при обработке данных. Позже я могу опубликовать больше твитов, связанных с dask, например, о параллельной обработке данных.