【问题标题】:Passing dask DataFrame as argument to task将 dask DataFrame 作为参数传递给任务
【发布时间】:2021-03-24 20:15:18
【问题描述】:

最佳实践是通过Client.submitdd.DataFrame 作为参数传递给任务,以将需要具体化数据帧的工作转移到工作人员而不是客户端上吗?以下似乎可行,但不清楚这是否是最佳选择:

def my_task(ddf: dd.DataFrame) -> None:
    df = ddf.compute()
    ...  # Work requiring the concrete pd.DataFrame

f = client.submit(my_task, ddf)

我能想到的唯一其他选择是用单个分区重新分区,然后运行。

【问题讨论】:

    标签: python dataframe dask


    【解决方案1】:

    虽然最佳实践列表中没有明确提及这一点,但最好按照您指定的方式进行。

    想象一个场景,您的客户拥有很少的资源(例如笔记本电脑),而工作人员拥有大量资源(例如,他们位于 HPC 集群上)。在这种情况下,将计算结果带到客户端甚至可能都不可行(例如,计算的数据帧对于笔记本电脑来说太大了,尽管工作人员可以计算它)。

    这是来自docs 的相关内容:

    避免重复将大量输入放入延迟调用中 每次你传递一个具体的结果(任何没有延迟的东西)时,Dask 都会默认对它进行哈希处理并为其命名。这是相当快的(大约 500 MB/s),但如果你一遍又一遍地这样做可能会很慢。相反,最好也延迟您的数据。 这在使用分布式集群避免为每个函数调用单独发送数据时尤其重要。

    因此传递 dask 对象(dask 数据帧、延迟、未来等)将最大限度地减少数据传输量并避免客户端资源最少时的潜在问题。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多