Как Dask обрабатывает внешние или глобальные переменные в определениях функций? - PullRequest
0 голосов
/ 25 июня 2019

Если у меня есть функция, которая зависит от некоторой глобальной или другой константы, например:

x = 123

def f(partition):
    return partition + x  # note that x is defined outside this function

df = df.map_partitions(f)

Это работает? Или мне нужно как-то явно включить внешнюю переменную x? 1005 *

1 Ответ

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

Один процесс

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

Распределенный или многопроцессный

Если нам нужно переместить функцию между процессами, нам нужно будет сериализовать эту функцию в строку байтов. Для этого Dask использует библиотеку cloudpickle .

Библиотека cloudpickle преобразует функцию Python f в объект bytes таким образом, чтобы в большинстве настроек захватывать внешние переменные. Поэтому один из способов проверить, будет ли ваша функция работать с Dask, - попытаться сериализовать ее и затем десериализовать на другой машине.

import cloudpickle
b = cloudpickle.dumps(f)

cloudpickle.loads(b)  # you may want to try this on your other machine as well

Как Cloudpickle достигает этого может быть довольно сложным. Вы можете посмотреть их документацию.

...