为控制流“计算”还是构建完全延迟的任务图更好?

问题描述

我有一个现有的Pandas代码库,并且刚刚开始尝试将其转换为dask。我仍在尝试绕着dask dataframedelayeddistributed缠头。通过阅读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} }部分计算。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...