DASK延迟和具有多个返回变量的模块

问题描述

我想使用dask的延迟功能。不幸的是,我不清楚在具有多个返回值的模块上使用延迟功能。例如,如果我按照以下代码段运行,则在计算最终结果后,无法指出 inc 模块的第一个返回值。

from dask import delayed
from time import sleep

def inc(x):
    sleep(1)
    return x+1,x+2

def add(x,y):
    sleep(1)
    return x + y

x = delayed(inc)(1)
y = delayed(inc)(2)
z = delayed(add)(x[0],y[0])
print(z.compute())

正确地,此代码段的结果如下。这表明指向有效。

(3,5)
 

但是,我无法读取x return的值。

%%time
result=z.compute()
print('Result is :',result)
print(x[0])

output: 
Result is : 5
Delayed('getitem-f80cf501fe43d6cbd50e0bec71c91c12')
cpu times: user 7.46 ms,sys: 2.13 ms,total: 9.59 ms
Wall time: 2 s

如果由于依赖关系已经计算出延迟函数的返回值而不进行计算,那将是一个很好的选择。

解决方法

默认情况下,Dask的compute方法返回具体结果,但清除所有中间结果。这对于需要大量内存的工作负载尤其重要。即时清除中间结果很重要。

如果要同时计算许多结果,请考虑使用dask.compute函数。

x,z = dask.compute(x,z)