从this和this问题来看,似乎编程模板的Dask-ish方法是dask.array.map_blocks
使用dask.array.ghost
或dask.array.map_overlap
。所以我有以下代码:
def local_stencil(block):
block[1:-1,1:-1,1:-1] = ( block[1:-1,1:-1,1:-1] + block[0:-2,1:-1,1:-1] + block[2:,1:-1,1:-1] + block[1:-1,0:-2,1:-1] + block[1:-1,2:,1:-1] + block[1:-1,1:-1,0:-2] + block[1:-1,1:-1,2:]) / 7.0;
return block
def stencil(grid, iterations, workers):
g = da.ghost.ghost(grid, depth={0:1, 1:1, 2:1}, boundary={0:0, 1:1, 2:0})
chunk_size = int(math.pow( g.shape[0]**3/workers, 1/3))
for iteration in range(iterations):
g = da.from_array( g.map_blocks(local_stencil).compute(), chunks=chunk_size)
return da.ghost.trim_internal(g, {0:1, 1:1, 2:1})
我不知道为什么与同一模板函数(local_stencil
)的numpy版本相比,它的性能要差得多:
我可以对代码进行任何更改以提高性能吗?
从this其他答案,我了解当文件大于RAM内存时Dask是如何有用的,但是Dask是否也可以在矩阵乘法或卷积运算等计算绑定操作中提供帮助?