Локальное использование dask: клиенту () или не клиенту ()? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь понять шаблоны использования Dask на локальной машине.

В частности,

  • У меня есть набор данных, который помещается в памяти
  • IЯ хотел бы сделать некоторые операции с пандами
    • groupby ...
    • разбор даты
    • и т. д.

Пандывыполняет эти операции через одно ядро, и эти операции занимают у меня часы.У меня 8 ядер на моей машине, и поэтому я хотел бы использовать Dask для максимально возможного распараллеливания этих операций.

У меня следующий вопрос: в чем разница между этими двумя способами?это в Dask:

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()

(1)

import dask.dataframe as dd

df = dd.from_pandas(
    pd.DataFrame(iris.data, columns=iris.feature_names),
    npartitions=2
)

df.mean().compute()

(2)

import dask.dataframe as dd
from distributed import Client

client = Client()

df = client.persist(
    dd.from_pandas(
        pd.DataFrame(iris.data, columns=iris.feature_names),
        npartitions=2
    )
)

df.mean().compute()

В чем преимущество одного шаблона использования над другим?Почему я должен использовать один над другим?

1 Ответ

0 голосов
/ 31 мая 2018

Версия (2) имеет два отличия от версии (1): выбор использования распределенного планировщика и persist.Это отдельные факторы.Существует множество документов, касающихся обоих: https://distributed.readthedocs.io/en/latest/quickstart.html, http://dask.pydata.org/en/latest/dataframe-performance.html#persist-intelligently, поэтому этот ответ может быть кратким.

1) Распределенный планировщик новее и умнее, чем предыдущий многопоточный имногопроцессорные планировщики.Как следует из названия, он может использовать кластер, но также работает на одной машине.Хотя задержка при вызове .compute(), как правило, выше, во многих отношениях она более эффективна, имеет более продвинутые функции, такие как динамическое программирование в реальном времени, и дополнительные средства диагностики, такие как панель инструментов.При создании с Client() по умолчанию вы получаете количество процессов, равное количеству ядер, но вы можете выбрать количество процессов и потоков и приблизиться к исходной ситуации только с потоками с Client(processes=False).

2) Сохранение означает оценку вычисления и его сохранение в памяти, чтобы дальнейшие вычисления выполнялись быстрее.Вы также можете сохранить без распределенного клиента (dask.persist).Он эффективно предлагает обменять память на производительность, потому что вам не нужно переоценивать вычисления каждый раз, когда вы используете их для всего, что от них зависит.В случае, когда вы продолжаете выполнять только одно вычисление на промежуточном звене, как в примере, это не должно иметь никакого значения для производительности.

...