dask: разница между client.persist и client.compute

Я не понимаю, какая разница между client.persist() а также client.compute() оба (в некоторых случаях) начинают мои вычисления, и оба возвращают асинхронные объекты, но не в моем простом примере:

В этом примере

from dask.distributed import Client
from dask import delayed
client = Client()

def f(*args):
    return args

result = [delayed(f(x)) for x in range(1000)]

x1 = client.compute(result)
x2 = client.persist(result)

Вот x1 а также x2 отличаются, но в менее тривиальном расчете, где result также список Delayed объекты, используя client.persist(result) начинает расчет так же, как client.compute(result) делает.

1 ответ

Решение

Соответствующая страница документа находится здесь: http://distributed.readthedocs.io/en/latest/manage-computation.html

Как вы говорите, оба Client.compute а также Client.persist возьмите ленивые коллекции Dask и запустите их на кластере. Они отличаются тем, что они возвращают.

  1. Client.persist возвращает копию для каждой из коллекций dask с их ранее ленивыми вычислениями, которые теперь отправляются для запуска в кластере. Графики задач этих коллекций теперь просто указывают на текущие объекты Future.

    Таким образом, если вы сохраняете фрейм данных dask с 100 разделами, вы возвращаете фрейм данных dask с 100 разделами, причем каждый раздел указывает на будущее, которое в данный момент выполняется в кластере.

  2. Client.compute возвращает одно будущее для каждой коллекции. Это будущее относится к одному результату объекта Python, собранному на одном работнике. Это обычно используется для небольших результатов.

    Таким образом, если вы вычислите dask.dataframe с 100 разделами, вы получите Future, указывающее на один кадр данных Pandas, который содержит все данные

Если говорить более прагматично, я рекомендую использовать persist, если ваш результат велик, и его необходимо распределить по многим компьютерам, и использовать вычисления, если ваш результат невелик и вы хотите использовать его только на одном компьютере.

На практике я редко использую Client.computeпредпочитая вместо этого использовать persist для промежуточной постановки и dask.compute чтобы опустить окончательные результаты.

df = dd.read_csv('...')
df = df[df.name == 'alice']
df = client.persist(df)  # compute up to here, keep results in memory

>>> df.value.max().compute()
100

>>> df.value.min().compute()
0

При использовании отложено

Задержанные объекты имеют только один "раздел" независимо, поэтому вычисления и сохранение более взаимозаменяемы. Persist вернет вам ленивый объект dask.delayed, в то время как compute вернет вам объект Future.

Другие вопросы по тегам