Python 如果任务之间的数据流很大,利用dask多处理调度程序的最有效方法是什么?
我们有一个dask计算图(非常定制,所以我们使用dask延迟而不是集合)。我在文档中读到,当前的调度策略是后进先出(LIFO),因此工作进程有很大的机会获得它刚刚计算的数据,以便在图表中进行下一步操作。但据我所知,这项任务 即使在这种情况下,计算结果仍然(反)序列化到硬盘 因此,问题是我要保持多少性能增益 在图中独立计算的单一路径上尽可能少的任务: A) 每条路径上都有许多小的“地图”任务Python 如果任务之间的数据流很大,利用dask多处理调度程序的最有效方法是什么?,python,parallel-processing,dask,Python,Parallel Processing,Dask,我们有一个dask计算图(非常定制,所以我们使用dask延迟而不是集合)。我在文档中读到,当前的调度策略是后进先出(LIFO),因此工作进程有很大的机会获得它刚刚计算的数据,以便在图表中进行下一步操作。但据我所知,这项任务 即使在这种情况下,计算结果仍然(反)序列化到硬盘 因此,问题是我要保持多少性能增益 在图中独立计算的单一路径上尽可能少的任务: A) 每条路径上都有许多小的“地图”任务 t --> t --> t -->... so
t --> t --> t -->...
some reduce stage
t --> t --> t -->...
T ->
some reduce stage
T ->
B) 每条路径都有一个巨大的“地图”任务
t --> t --> t -->...
some reduce stage
t --> t --> t -->...
T ->
some reduce stage
T ->
谢谢大家! dask多处理调度程序将自动将线性任务链融合到单个任务中,因此上述案例A将自动成为案例B 如果您的工作负载更复杂,并且确实需要节点间通信,那么您可能希望在一台计算机上尝试分布式调度程序。它更智能地管理工作人员之间的数据移动
$ pip install dask distributed
>>> from dask.distributed import Client
>>> c = Client() # Starts local "cluster". Becomes the global scheduler
进一步阅读
另外,需要注意的是,Dask不会将中间结果持久化到磁盘上。相反,它在流程之间直接传递中间结果。谢谢!这很有趣,因为我们有一个不可变量化的对象(lasio.LasFile-cloudpickle由于某种原因无法处理它),作为一个唯一的中间结果,它只存在于计算图中的单个路径上。dask从一开始就失败了,但在取消勾选时出现异常。如果对象在dask图中,而不是作为中间输出,那么应该预料到该错误。当你说“从一开始就正确”时,这是否意味着对象出现在你要求dask计算的计算中?不,它的实例是由图中任务的第一行生成的