Dask map_blocks运行较早,导致了重叠和嵌套过程的不良结果



我正在使用Dask创建一个简单的数据操作管道。我基本上用了3个函数。前两个使用简单的map_blocks,第三个也使用map_blocks,但用于重叠的数据。

由于某种原因,第三个map_blocks比我想要的执行得早。查看代码和python输出(不执行run():

)
data = np.arange(2000)
data_da = da.from_array(data, chunks=(500,))
def func1(block, block_info=None):
    return block + 1
def func2(block, block_info=None):
    return block * 2
def func3(block, block_info=None):
    print("func3", block_info)
    return block
data_da_1 = data_da.map_blocks(func1)
data_da_2 = data_da_1.map_blocks(func2)
data_da_over = da.overlap.overlap(data_da_2, depth=(1), boundary='periodic')
data_da_map = data_da_over.map_blocks(func3)
data_da_3 = da.overlap.trim_internal(data_da_map, {0: 1})

输出为:

func3 None
func3 None

它仍然不尊重块的数量,这里是4。

我真的不知道这段代码有什么问题。特别是因为如果我使用visualize()来查看数据图,它会构建我想要的正确数据序列。

最初,我认为overlap需要compute()之前像rechunk一样,但我已经测试过了。

与许多任务操作一样,重叠操作可以传递一个指定输出类型和维数的meta参数,或者dask将使用数据的一个小子集(或长度为零)执行该函数。

From dask.array.map_overlap docs:

请注意,此函数将尝试在计算前自动确定输出的数组类型,如果您期望该函数在0-d数组上操作时不会成功,请参考map_blocks中的meta关键字参数。

最新更新