我想我遗漏了一些东西(仍然是Dask Noob),但是我正在尝试进行批处理建议,以避免从此处避免太多的Dask任务:
https://docs.dask.org/en/latest/delayed-best-practices.html
,并且无法使其正常工作。 这是我尝试过的:
import dask
def f(x):
return x*x
def batch(seq):
sub_results = []
for x in seq:
sub_results.append(f(x))
return sub_results
batches = []
for i in range(0, 1000000000, 1000000):
result_batch = dask.delayed(batch, range(i, i + 1000000))
batches.append(result_batch)
批次现在包含延迟的对象:
batches[:3]
[Delayed(range(0, 1000000)),
Delayed(range(1000000, 2000000)),
Delayed(range(2000000, 3000000))]
但是当我计算它们时,我得到了批处理函数指针(我认为?):
results = dask.compute(*batches)
results[:3]
(<function __main__.batch(seq)>,
<function __main__.batch(seq)>,
<function __main__.batch(seq)>)
我有两个问题:
这真的是应该如何运行,因为它似乎与Best practices
页的第一行相反,该行说要不像{{1} },因为它会立即运行而不是偷懒。
如何获得上述批处理运行的结果?
答案 0 :(得分:1)
您的代码似乎缺少一对括号。不确定这是否是错字(???)。
根据文档中的示例,我认为您想要
result_batch = dask.delayed(batch)(range(i, i + 1000000))
我将batch, ran...
替换为batch)(ran...
的地方,因为对batch()
函数的调用应该被延迟。
答案
dask.delayed
包装的内容很重要。使用dask.delayed( batch(range(i, i + 1000000)) )
不会延迟对函数batch(...)
的调用,因此它将立即运行。这是因为函数的输出已包装在dask.delayed
中,因此输出(结果)将被延迟,这不是所需的工作流程。但是,dask.delayed(batch)(range(i, i + 1000000))
延迟了对函数的调用(因为这里dask.delayed
包装了函数本身)。我相信这是文档在最佳实践部分的开头要说的话。