Хуже производительность при доступе к общему ресурсу из вызова ddf.map_partitions - PullRequest
0 голосов
/ 18 июня 2019

Я сталкиваюсь с проблемой производительности при доступе к глобальному файлу .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.Но, безусловно, я извлеку из этого пользу на следующих этапах обработки.

Что вы думаете?Есть ли способ обойти это поведение блокировки?

1 Ответ

0 голосов
/ 21 июня 2019

Этот кусок кода занимает около 20 секунд. Если я работаю с pandas-dataframe в памяти, это займет около 7 секунд.

Если вы можете заставить Панд работать на себя, то это почти всегда лучший выбор.

https://docs.dask.org/en/latest/best-practices.html#start-small

Мое первое предположение состоит в том, что плохая производительность происходит из-за некоторого поведения блокировки между отдельными потоками, из которых вызывается get_dist2coast. dist2coast_1deg_merged.nc содержит значения расстояния до побережья в сетке широта / долгота.

Возможно. Я рекомендую профилировать ваш код, чтобы увидеть, что медленно. Изучение этого, вероятно, поможет вам достичь хороших результатов.

https://docs.dask.org/en/latest/understanding-performance.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...