Dask 数据帧中 "compute()" 背后的逻辑是什么?

What is the logic behind "compute()" in Dask dataframes?

我很难理解何时以及何时不在 Dask 数据帧中使用 compute()。我通常按​​ adding/removing compute() 编写我的代码,直到代码运行为止,但这非常容易出错。我应该如何在 Dask 中使用 compute()? Dast Distributed 有什么不同吗?

延迟计算的核心思想是延迟实际计算,直到知道最终目标。这允许:

  • 提高编码速度(例如,作为数据科学家,我不需要在设计工作流之前等待每个转换步骤完成),
  • 在多个工人之间分配工作,
  • 克服我客户的资源限制,例如如果我使用的是内存有限的笔记本电脑,我可以 运行 在云中的 dask worker 或具有更多资源的另一台机器上进行大量计算,
  • 如果最终目标只需要完成一些任务,效率会更高(例如,如果最终计算只需要数据帧的一个子集,那么 dask 将只加载相关的 columns/partitions)。

调用 .compute 的一些替代方法是:

  • .visualize():这有助于可视化任务图。当有很多任务时,DAG 可能会变得多毛,因此这对于 运行 较小的数据子集(例如仅加载数据帧的 two/three 分区)
  • 很有用
  • using client.submit:这会立即启动计算,为您提供一个 future,一个引用正在计算的任务结果的对象。这提供了跨多个工作人员扩展工作的优势,但它可能会占用更多资源(因为 dask 不知道完整的工作流程,它可能 运行 不需要实现最终目标的计算)。

关于 distributed,我认为除了结果的位置之外没有区别:dask.compute 会将结果放在本地机器上,而 client.compute会将结果保存在远程工作人员身上。

Dask DataFrame 中的每个分区都是一个 Pandas DataFrame。

compute() 将所有分区(Pandas DataFrame)组合成一个 Pandas DataFrame。

Dask 速度很快,因为它可以并行地对分区执行计算。 Pandas 可能会更慢,因为它只适用于一个分区。

您应该尽可能避免调用 compute()。最好将数据分散在多个分区中,这样可以并行处理。

在极少数情况下,您可以计算到 Pandas(例如,在进行从大到小的连接时或在进行大量过滤操作之后),但最好学习如何使用 Dask API 来运行 并行计算。