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)
と同じように計算します。
関連するドキュメントページはこちら: http://distributed.readthedocs.io/en/latest/manage-computation.html#dask-collections-to-futures
あなたが言うように、Client.compute
とClient.persist
の両方が遅延のあるDaskコレクションを取得し、クラスターで実行を開始します。彼らは彼らが返すもので異なります。
Client.persistは、クラスターで実行するために送信された以前の遅延計算のあるdaskコレクションのそれぞれのコピーを返します。これらのコレクションのタスクグラフは、現在実行中のFutureオブジェクトをポイントするだけです。
したがって、100パーティションのdaskデータフレームを永続化すると、100パーティションのdaskデータフレームが返され、各パーティションは現在クラスターで実行されているfutureを指します。
Client.computeは、コレクションごとに単一のFutureを返します。この未来は、1人のワーカーで収集された単一のPythonオブジェクト結果を指します。これは通常、小さな結果に使用されます。
したがって、100パーティションのdask.dataframeを計算すると、単一のPandasすべてのデータを保持するデータフレームを指すFutureが返されます
より実用的には、結果が大きく、多くのコンピューターに分散する必要がある場合は、persistを使用し、結果が小さく、1台のコンピューターだけで実行したい場合は、computeを使用することをお勧めします。
実際には、私はめったにClient.compute
を使用しません。代わりに、中間ステージングにpersistを使用し、dask.compute
を使用して最終結果をプルダウンする方を好みます。
df = dd.read_csv('...')
df = df[df.name == 'alice']
df = df.persist() # compute up to here, keep results in memory
>>> df.value.max().compute()
100
>>> df.value.min().compute()
0
遅延オブジェクトは「パーティション」を1つしか持たないため、計算と永続化はより交換可能です。 Persistは遅延のあるdask.delayedオブジェクトを返し、computeは即時のFutureオブジェクトを返します。