当前位置: 首页 > 知识库问答 >
问题:

dask:client.persist和client.compute之间的差异

宓和同
2023-03-14

我对client.persist()client.compute()之间的区别感到困惑,它们似乎(在某些情况下)都启动了我的计算,并且都返回异步对象,但在我的简单示例中并非如此:

在本例中

from dask.distributed import Client
from dask import delayed
client = Client()

def f(*args):
    return args

result = [delayed(f)(x) for x in range(1000)]

x1 = client.compute(result)
x2 = client.persist(result)

在这里,x1x2是不同的,但在一个不那么简单的计算中,result也是延迟的对象的列表,使用client.persist(result)启动计算,就像使用client.compute(result)一样。

共有1个答案

封烨伟
2023-03-14

此处有相关的文档页面:http://distributed.readthedocs.io/en/latest/manage-computation.html#dask-collections-to-futures

正如您所说的,client.computeclient.persist都接受惰性Dask集合,并启动它们在集群上运行。他们在返回的东西上是不同的。

>

  • client.persist为每个dask集合返回一个副本,这些集合以前是懒散的计算,现在提交到集群上运行。这些集合的任务图现在只指向当前运行的Future对象。

    因此,如果您持久化一个有100个分区的dask数据帧,那么您将返回一个有100个分区的dask数据帧,每个分区都指向当前在集群上运行的未来数据帧。

    Client.Compute为每个集合返回一个Future。这个未来指的是在一个工作者上收集的单个Python对象结果。这通常用于较小的结果。

    因此,如果计算一个包含100个分区的Dask.dataframe,则返回一个指向包含所有数据的单个Pandas dataframe的未来

    更实用的做法是,当您的结果很大并且需要在多台计算机中传播时,我建议使用persist,而当您的结果很小并且只想在一台计算机上传播时,我建议使用compute。

    在实践中,我很少使用client.compute,而是更喜欢使用persist进行中间分段,使用dask.compute下拉最终结果。

    df = dd.read_csv('...')
    df = df[df.name == 'alice']
    df = df.persist()  # compute up to here, keep results in memory
    
    >>> df.value.max().compute()
    100
    
    >>> df.value.min().compute()
    0
    

    无论如何,延迟对象只有一个“分区”,因此compute和Persiste更易互换。Persist会给你一个懒散的dask.delayed对象,而compute会给你一个即时的Future对象。

  •  类似资料:
    • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

    • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

    • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

    • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

    • 我是Hadoop的新手。我正在浏览专业Hadoop解决方案的书,以获得一些关于Hadoop和生态系统的知识。我想澄清HDFS和HBase之间的主要区别是什么。我理解的方式就像两者都是存储系统。它们的区别只是在访问数据方面。HBase通过非关系型数据库访问数据,HDFS使用计算框架(MapReduce)处理数据。如果是这种情况,为什么我们不能只有一个存储HDFS或HBase。根据需求,他们将插入和插

    • 有人能解释一下 和 我不知道确切的意思。