我对如何从dask中获得最佳效果感到困惑。
问题
我有一个包含多个时间序列的数据帧(每个都有自己的key
),我需要在每个时间序列上运行一个函数my_fun
。用熊猫解决它的一种方法涉及到
df = list(df.groupby("key"))
然后应用my_fun
多处理。尽管使用了大量RAM,但这些性能在我的机器上非常好,在谷歌云计算上也很糟糕。
在Dask上我当前的工作流程是:
import dask.dataframe as dd
from dask.multiprocessing import get
由于我没有设置索引df.known_divisions
是False
问题:
df.npartitions
作为ncpu
的倍数或不重要是否更好?从this开始,将索引设置为关键似乎更好。我的猜测是我可以做类似
的事情df [“key2”] = df [“key”] df = df.set_index(“key2”)
但是,我不知道这是否是最好的方法。
答案 0 :(得分:4)
对于像&#34这样的问题;什么是花时间"在Dask中,通常建议您使用"distributed" scheduler而不是多处理 - 您可以使用任意数量的进程/线程运行,但通过诊断仪表板可以获得更多信息。
对于您的具体问题,如果您正在对不完全分割在分区之间的列进行分组并应用除简单聚合之外的任何内容,则您将不可避免地需要进行随机播放。设置索引会将此作为显式步骤进行随机播放,或者在任务图中显示隐式随机播放。这是一个多对多操作,每个聚合任务都需要从每个原始分区输入,因此是瓶颈。没有绕过那个。
对于分区数量,是的,您可以在8个核心上具有9个分区等次优条件(您将计算8个任务,然后可能阻止一个核心上的最终任务,而其他核心空闲);但一般来说,只要您没有使用极少数的分区,就可以依赖于dask来做出合理的调度决策。在许多案例中,这并不重要。