使用dask延迟返回列表的函数

时间:2017-12-11 16:14:50

标签: python python-multiprocessing dask dask-delayed

我正在尝试使用dask.delayed来构建任务图。这大部分工作得非常好,但我经常遇到这样的情况,我有一些延迟对象有一个方法返回一个长度的对象列表,这个对象列表不容易根据我此时可用的信息计算:< / p>

items = get_collection() # known length

def do_work(item):
    # get_list_of_things returns list of "unknown" length
    return map(lambda x: x.DoStuff(), item.get_list_of_things())

results = [delayed(do_work(x)) for x in items]

这给出了

TypeError: Delayed objects of unspecified length are not iterable

在dask中是否有办法解决这个问题,最好不必在中间结果上调用.compute(),因为这会破坏任务图的大部分优势?它基本上意味着图形在其某些步骤运行之后才能完全解析,但唯一可变的是并行部分的宽度,它不会改变图形的结构或深度。

1 个答案:

答案 0 :(得分:1)

不幸的是,如果你想在列表中的每个元素上调用一个单独的函数,那么 是图形结构的一部分,如果你想要,必须在图形构造时知道使用dask.delayed。

一般来说,我看到两个选项:

  1. 不要为列表中的每个元素创建单独的任务,而是为前10%,第二个10%等创建任务。这与dask.bag中采用的方法相同,它还处理具有未知数量元素的并行性(这可能值得考虑。

    http://dask.pydata.org/en/latest/bag.html

  2. 切换到实时concurrent.futures界面,等待列表结果再提交更多作品

    validators.py

    http://dask.pydata.org/en/latest/futures.html