1

我有一个现有的 Pandas 代码库,并且刚刚开始尝试将其转换为 Dask。我仍在尝试围绕 Dask dataframedelayeddistributed。通过阅读dask.delayed文档,似乎理想的情况是为我想要执行的整个操作集构建一个任务/计算图,包括delayed用于用户消息的函数,然后在一大块中运行所有计算结尾。这样,调用进程就不需要在 Dask 集群执行实际工作时继续运行。

不过,我一直面临的问题是,似乎在某些情况下这是不可行的,尤其是在涉及 Python 控制流时。例如:

df = dd.read_csv(...)
if df.isnull().any():
    # early exit
    raise ValueError()
df = some(df)
df = more(df)
df = calculations(df)
# and potentially more complex control flow

我真的不明白如何在不调用df.isnull().any().compute().

我现在也不知道调用compute()persist()脚本中是否有任何“坏”(与最佳实践相反)。在网上查看很多示例时,它们似乎是基于实验性/基于 Jupyter 的环境,这load -> preparation -> persist() -> experimentation似乎是标准方法。由于我有一组相对线性的操作 ( load -> op1 -> op2 -> ... -> opn -> save),我认为我应该尽可能快地尝试简单地安排任务而不进行任何计算并避免compute/ persist,我现在觉得这让我陷入了死胡同。

所以总结一下,我想我有两个问题想要回答,第一个是“使用起来很糟糕compute吗?”,第二个是“如果是,我怎样才能避免compute但仍然拥有良好且可读的控制流?”。

4

1 回答 1

1

只要你需要一个具体的值,就可以调用compute。控制流就是一个很好的例子。

您可能希望首先调用.persist()计算的主干,然后调用.compute()控制流位,以确保您不会重复load -> op1 -> op2 -> ...计算的部分。

于 2020-09-07T22:02:00.347 回答