在 dask 集群中访问分散数据的成本
Cost of accessing scattered data in a dask cluster
我使用 dask 来并行化一些处理,这很有趣。
我有一个案例,客户端的计算需要生成一些非常繁重的查找数据,所以将这些数据分散到客户端:
[future_dict] = client.scatter([large_dict], broadcast=True)
计算结果类似于
def worker(i):
key = do_some_work()
data = future_dict.result()[key]
res = do_some_more_work( data )
return (i, res )
f = client.map( worker, range(200))
res = client.gather( f )
这可行,但查找 future_dict.result()[key]
非常慢。在 worker 中进行查找所花费的时间类似于 unpickl'ing 的 pickled 版本 large_dict
,所以我猜我的字典在每个 worker 中都被反序列化了。
我可以做些什么来更快地访问分散的数据吗?例如,如果我对数据在每个 worker 中被反序列化的假设是正确的,我可以做些什么来使反序列化只在每个客户端中发生一次吗?
你所做的应该没问题,但如果你想让它更快,你可以在未来传递一个明确的论点。
def func(i, my_dict=None):
key = do_some_work()
data = my_dict[key]
res = do_some_more_work( data )
return (i, res )
f = client.map( func, range(200), my_dict=future_data)
res = client.gather( f )
我使用 dask 来并行化一些处理,这很有趣。
我有一个案例,客户端的计算需要生成一些非常繁重的查找数据,所以将这些数据分散到客户端:
[future_dict] = client.scatter([large_dict], broadcast=True)
计算结果类似于
def worker(i):
key = do_some_work()
data = future_dict.result()[key]
res = do_some_more_work( data )
return (i, res )
f = client.map( worker, range(200))
res = client.gather( f )
这可行,但查找 future_dict.result()[key]
非常慢。在 worker 中进行查找所花费的时间类似于 unpickl'ing 的 pickled 版本 large_dict
,所以我猜我的字典在每个 worker 中都被反序列化了。
我可以做些什么来更快地访问分散的数据吗?例如,如果我对数据在每个 worker 中被反序列化的假设是正确的,我可以做些什么来使反序列化只在每个客户端中发生一次吗?
你所做的应该没问题,但如果你想让它更快,你可以在未来传递一个明确的论点。
def func(i, my_dict=None):
key = do_some_work()
data = my_dict[key]
res = do_some_more_work( data )
return (i, res )
f = client.map( func, range(200), my_dict=future_data)
res = client.gather( f )