我有一个现有的 Pandas 代码库,并且刚刚开始尝试将其转换为 Dask。我仍在尝试围绕 Dask dataframe
、delayed
和distributed
。通过阅读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
但仍然拥有良好且可读的控制流?”。