问题描述
我有一个现有的Pandas代码库,并且刚刚开始尝试将其转换为dask。我仍在尝试绕着dask dataframe
,delayed
和distributed
缠头。通过阅读dask.delayed
文档,看来 ideal 案例似乎是为我要执行的整个操作集(包括{{1})建立任务/计算图}函数用于用户消息,然后在一个大块中最后运行所有计算。这样,在dask集群执行实际工作时,调用进程将不需要继续运行。
不过,我一直面临的问题是,似乎有些情况不可行,尤其是在Python控制流方面。例如:
delayed
我真的不知道如何在不致电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()
有什么“坏”(与最佳实践相反)。在网上查看许多示例时,它们似乎基于实验/基于Jupyter的环境,其中persist()
似乎是标准方法。由于我有一组相对线性的操作(load -> preparation -> persist() -> experimentation
),因此我认为我应该尝试简单地安排任务而不进行任何计算,并避免使用load -> op1 -> op2 -> ... -> opn -> save
/ compute
,我现在感到自己陷入了困境。
因此,总而言之,我想我有两个问题想回答,第一个是“使用persist
是否不好?”,第二个是“如果可以,我如何避免{{1} },但仍然具有良好且可读的控制流程?”。
解决方法
当您需要一个具体值时,完全可以调用compute。控制流就是一个很好的例子。
您可能想先在计算的主干上调用.persist()
,然后再调用.compute()
作为控制流位,只是为了确保您不重复{{1} }部分计算。