在 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 )