将部分结果存储在dask延迟迭代中

时间:2017-07-03 12:35:36

标签: python loops dask

我有一个当前的长迭代过程,我运行计算,每次x迭代我将结果存储到DB。

例如,对fun()上的range(20)函数进行迭代,并使用save_results保存每5个结果:

import time

def fun(x):
    time.sleep(0.1*x)
    return(0.1*x)

def save_results(result):
    # originally stores the new data to DB
    print result  # print as example

result = []
for i in range(20):
    result.append(fun(i))
    if i%5==4:
        save_results(result[-5:])

我希望使用dask delayedcompute方法将流程并行化。但是,如果我像以下示例中那样运行它,store_results发生在compute之前:

import dask as da

result = []
for i in range(20):
    result.append(da.delayed(fun)(i))
    if i%5==4:
        save_results(result[-5:])

result = da.compute(result)[0]

因此,我不是每5次迭代存储结果,而是存储延迟对象列表:

[Delayed('fun-202f7e28-e594-4926-a5cd-5931dbc99d6b'),
Delayed('fun-d2bf2bc9-a4f3-46d7-adb7-84114a68b482'),
Delayed('fun-c34f2c04-3e25-47fa-8165-1ee7c786aaf6'),
Delayed('fun-a4edd3fc-442d-4ec1-8a0e-320bd9315a61'),
Delayed('fun-c7b48e2c-cb66-472e-85c5-fe6c595fa1ec')]

我如何克服这个问题,并将每5个新结果存储到DB?

1 个答案:

答案 0 :(得分:2)

您应该延迟对延迟对象进行操作的任何函数调用

顺序代码

result = []
for i in range(20):
    result.append(fun(i))
    if i%5==4:
        save_results(result[-5:])

并行代码

def fun(x):
    ...

result = []
side_effects = []
for i in range(20):
    result = dask.delayed(fun)(i)
    results.append(result)
    if i%5==4:
        value = dask.delayed(save_results)(result[-5:])
        side_effects.append(value)

dask.compute(results + side_effects)