如果任务之间的数据流很大,那么利用 dask 多处理调度程序的最有效方法是什么?

What is the most efficient way to utilize dask multiprocessing scheduler if data flow between tasks is big?

我们有一个 dask 计算图(非常自定义,所以我们使用 dask delayed 而不是集合)。我在文档中读到当前的调度策略是后进先出,这样工作进程就有很大的机会获得它刚刚计算的数据,以便在图中进一步执行。但据我了解任务 即使在这种情况下,计算结果仍然(反)序列化到硬盘。

所以问题是我要保持多少性能提升 尽可能少的任务沿着图中独立计算的单一路径:

A) 每条路径上有许多小 "map" 任务

t --> t --> t -->...
                     some reduce stage
t --> t --> t -->...

B) 每个路径都有一个巨大的 "map" 任务

   T ->
        some reduce stage
   T -> 

谢谢!

dask multiprocessing 调度程序会自动将线性任务链融合为单个任务,因此您上面的案例 A 将自动成为案例 B。

如果您的工作负载更复杂并且确实需要节点间通信,那么您可能想在单台计算机上尝试分布式调度程序。它更智能地管理工作人员之间的数据移动。

$ pip install dask distributed

>>> from dask.distributed import Client
>>> c = Client()  # Starts local "cluster".  Becomes the global scheduler

进一步阅读

更正

另外,请注意,Dask 不会将中间结果保存在磁盘上。相反,它直接在进程之间传递中间结果。