我有大量的条目E和一个函数f: E --> pd.DataFrame
。对于不同的输入,函数f的执行时间可能会发生很大变化。最后,所有DataFrame应该连接成一个DataFrame。
我想避免的情况是分区(为了示例,使用2个分区),意外地,所有快速功能执行都发生在分区1上,所有慢速执行都发生在分区2上,因此不能最佳地使用工人。
partition 1:
[==][==][==]
partition 2:
[============][=============][===============]
--------------------time--------------------->
我目前的解决方案是迭代条目集合并使用delayed
创建Dask图表,在最终结果DataFrame中汇总延迟的部分DataFrame结果dd.from_delayed
。
delayed_dfs = []
for e in collection:
delayed_partial_df = delayed(f)(e, arg2, ...)
delayed_dfs.append(delayed_partial_df)
result_df = from_delayed(delayed_dfs, meta=make_meta({..}))
我推断Dask调度程序会将工作分配给可用的工作人员。
答案 0 :(得分:1)
如上面的评论所述,是的,你所做的是明智的。
这些任务最初将分配给工人,但如果一些工人在其他人之前完成分配的任务,那么他们将动态地从那些工作过剩的工人那里窃取任务。
同样如评论中所述,您可以考虑使用诊断仪表板来充分了解调度程序正在执行的操作。所有关于工人负荷,偷工作等信息都很容易看到。