Я сталкиваюсь с проблемой производительности при доступе к глобальному файлу .nc из функции dask.dataframe.map_partitions.
Некоторые сведения: У меня большой набор файлов netCDFсо значениями, сопоставленными со значениями lat + lon.Для каждой строки val + lat + lon я хочу вычислить значение расстояния до побережья.
Поскольку все наборы данных не помещаются в память сразу, я подумал об использовании dask.dataframe (ddf).Я уже сгенерировал ddf и хочу добавить столбец dist2coast сейчас.Вот мой псевдокод:
def get_dist2coast(latarr, lonarr, do_interp=True, cfilepath='~/data/dist2coast/dist2coast_1deg.nc'):
""" Calculates distance to coast."""
#
# access global/common dist2coast_1deg.nc file
# e.g.:
#
# ds = xr.open_dataset('~/data/dist2coast/dist2coast_1deg_merged.nc')
# return d2c_vec based on lat+lon values
ddf = ddf.map_partitions(lambda df: df.assign(dist2coast=get_dist2coast(df.lat, df.lon, do_interp=False)))
Этот фрагмент кода занимает около 20 секунд.Если я работаю с pandas-dataframe в памяти, это займет около 7 секунд.
Мое первое предположение - плохая производительность из-за некоторого поведения блокировки между отдельными потоками, из которых вызывается get_dist2coast.dist2coast_1deg_merged.nc содержит значения расстояния до побережья в сетке широта / долгота.
Для этого я в действительности не полагаюсь на оптимизацию производительности dask.Но, безусловно, я извлеку из этого пользу на следующих этапах обработки.
Что вы думаете?Есть ли способ обойти это поведение блокировки?