2017-01-26 7 views
2

次のコードでは、最初の計算には3 +秒が必要で、2番目の計算ははるかに高速になることが期待されます。クライアントに計算を再実行させないためにdaskを得るにはどうしたらよいですか? (私は以前に真=純粋について、この質問への答えを探していたし、何も見つかっていない)Daskで同じ値を再計算しないでください。

from dask import delayed, compute 
from dask.distributed import Client 

@delayed(pure=True) 
def foo(a): 
    time.sleep(3) 
    return 1 

foo_res = foo(1) 

client = Client() 

import time 
t1 = time.time() 
results = compute(foo_res, get=client.get) 
t2 = time.time() 
print("Time : {}".format(t2-t1)) 


t1 = time.time() 
results = compute(foo_res, get=client.get) 
t2 = time.time() 
print("Time : {}".format(t2-t1)) 

出力:

Time : 3.01729154586792 
Time : 3.0170397758483887 

答えて

2

あなたがクライアント上persistメソッドを使用する必要があります

foo_res = client.persist(foo_res) 

これは、foo_resへの参照がyoにある限り、バックグラウンドで計算を開始し、結果をメモリに保持しますウルPythonのセッション

関連ドキュメントのページはこちらです:http://distributed.readthedocs.io/en/latest/manage-computation.html

+0

ああ、私は、ドキュメントを通してそれを行ってきましたが、それを見つけることができませんでした、ありがとう!私は実際にはオブジェクト参照に依存しないargs btwをどのようにハッシュするのが好きですが、データに固有です。非常に便利なライブラリ、ありがとう! – julienl

+1

あなたが送った文書は、参照が残っている限り、 'persist'、' compute'などのどれもが動作することを示唆しています。 例: 'event foo_res_future = client.compute(foo_res)' 私のために働くようですね。 – julienl

+0

正解ですが、 'dsk.compute'ではなく' client.compute'でなければなりません。歴史的な理由からそれらは異なっている。 – MRocklin

関連する問題