Dask性能:工作流怀疑

Dask性能:工作流怀疑,dask,dask-distributed,Dask,Dask Distributed,我对如何从达斯克得到最好的东西感到困惑 问题 我有一个包含多个时间序列的数据帧(每个时间序列都有自己的键),我需要在每个时间序列上运行函数my_fun。解决熊猫问题的一个方法是 df=list(df.groupby(“key”))然后应用my\u fun 具有多处理功能。尽管RAM的使用量很大,但性能在我的机器上相当不错,在谷歌云计算上却很糟糕 在Dask上,我当前的工作流程是: import dask.dataframe as dd from dask.multiprocessing impo

我对如何从达斯克得到最好的东西感到困惑

问题 我有一个包含多个时间序列的数据帧(每个时间序列都有自己的
),我需要在每个时间序列上运行函数
my_fun
。解决熊猫问题的一个方法是
df=list(df.groupby(“key”))
然后应用
my\u fun
具有多处理功能。尽管RAM的使用量很大,但性能在我的机器上相当不错,在谷歌云计算上却很糟糕

在Dask上,我当前的工作流程是:

import dask.dataframe as dd
from dask.multiprocessing import get
  • 从S3读取数据。14个文件->14个分区
  • `df.groupby(“key”).apply(我的乐趣).to_frame.compute(get=get)
  • 因为我没有设置索引
    df。已知的分区是
    False

    生成的图形是 我不知道我看到的是不是瓶颈

    问题:

  • df.npartitions
    作为
    ncpu
    的倍数是更好还是没关系
  • 从这个角度来看,最好将索引设置为键。我猜我可以做一些类似的事情

    df[“键2”]=df[“键”] df=df.set_索引(“键2”)

  • 但是,再一次,我不知道这是否是最好的方法

    对于Dask中的“什么需要时间”之类的问题,通常建议您使用而不是多处理-您可以使用任意数量的进程/线程运行,但通过诊断仪表板可以获得更多信息

    对于您的特定问题,如果您要对一列进行分组,而该列在分区之间没有很好地分割,并且应用除简单聚合之外的任何内容,那么您将不可避免地需要进行洗牌。设置索引会将此洗牌作为显式步骤进行,或者在任务图中得到显式洗牌。这是一个多对多操作,每个聚合任务都需要来自每个原始分区的输入,因此成为瓶颈。这是绕不开的


    至于分区的数量,是的,您可以有次优条件,比如8个核上有9个分区(您将计算8个任务,然后可能在一个核上阻塞最后一个任务,而其他核处于空闲状态);但一般来说,只要不使用非常少的分区,就可以依靠dask做出合理的调度决策。在许多情况下,这无关紧要。

    我错了吗?或者使用分布式调度器的方法是通过
    client=client()
    df=client.persist(df)
    这是设置调度器的最简单方法,适合实验。您可能希望更明确地使用各种参数和/或让调度器在当前python会话中运行和/或分布在多台机器上,请参阅。