当前位置:  开发笔记 > 编程语言 > 正文

dask:client.persist和client.compute之间的区别

如何解决《dask:client.persist和client.compute之间的区别》经验,为你挑选了1个好方法。

我感到困惑的区别是什么之间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也是一个Delayed对象列表,使用client.persist(result)开始计算就像client.compute(result)那样.



1> MRocklin..:

相关文档页面位于: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.这个未来指的是在一个worker上收集的单个Python对象结果.这通常用于小结果.

    因此,如果您计算一个包含100个分区的dask.dataframe,您将获得一个指向包含所有数据的单个Pandas数据帧的Future.

更实际的是,我建议在结果很大时使用persist并且需要在许多计算机之间传播,并且当结果很小并且只想在一台计算机上使用时使用计算机.

在实践中,我很少使用Client.compute,而是宁愿使用持久性进行中间分期并dask.compute降低最终结果.

df = dd.read_csv('...')
df = df[df.name == 'alice']
df = client.persist(df)  # compute up to here, keep results in memory

>>> df.value.max().compute()
100

>>> df.value.min().compute()
0

使用延迟时

延迟对象只有一个"分区",因此计算和持久性更加可互换.Persist会给你一个懒惰的dask.delayed对象,而compute会给你一个直接的Future对象.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有