从Dask阵列中拾取多个切片的最佳方法

从Dask阵列中拾取多个切片的最佳方法,dask,dask-distributed,Dask,Dask Distributed,我正在使用Dask阵列生成分布在多个节点之间的大型(65k x 65k x 3)3D信号。 在下一步中,我需要使用存储在Dask包中的切片从该阵列中提取数千个瓷砖。我的代码如下所示: 将dask.array导入为da 将dask.bag作为数据库导入 从dask.distributed导入客户端 def拾取块(窗口、信号): 返回np.数组(曲面[窗口]) 块上的def计算(信号块): #在(nxnx3)信号块上做一些相当短的计算。 dask_客户端=客户端(…) 信号数组=生成信号(…)#返回

我正在使用Dask阵列生成分布在多个节点之间的大型(65k x 65k x 3)3D信号。 在下一步中,我需要使用存储在Dask包中的切片从该阵列中提取数千个瓷砖。我的代码如下所示:

将dask.array导入为da
将dask.bag作为数据库导入
从dask.distributed导入客户端
def拾取块(窗口、信号):
返回np.数组(曲面[窗口])
块上的def计算(信号块):
#在(nxnx3)信号块上做一些相当短的计算。
dask_客户端=客户端(…)
信号数组=生成信号(…)#返回dask数组
信号_切片=db.来自_序列(生成_切片(…)#固定大小切片
signal\u tiles=signal\u slices.map(拾取tile,signal=signal\u数组)
结果=dask_client.compute(信号_tile.map(计算在_tile上),sync=True)
我的问题是计算需要很多时间。我尝试使用以下方法分散我的信号阵列:

signal\u array=dask\u client.scatter(生成\u信号(…)
但这无助于提高性能(计算时间约为12分钟)。相比之下,计算第一层的完整信号和stdev大约需要2分钟


有没有一种有效的方法可以从分布式Dask数组中选取大量切片?

如果只有几千个切片,那么我建议使用普通的Python列表而不是Dask包。它可能会更快、更简单

然后可以多次切片阵列:

tiles = [dask_array[slc] for slc in slices]
如果你想的话,可以计算这些

tiles = dask.compute(*tiles)

如果您只有几千个切片,那么我建议使用普通的Python列表而不是Dask包。它可能会更快、更简单

然后可以多次切片阵列:

tiles = [dask_array[slc] for slc in slices]
如果你想的话,可以计算这些

tiles = dask.compute(*tiles)

谢谢你的回答@MRocklin,但是,我想把它们放在一个袋子里,因为在一个步骤中,我需要在这些切片和一个相当大的袋子之间执行笛卡尔积,然后执行更复杂的计算。你介意我在github Dask repo上提交一个问题来提供更多细节吗?谢谢你的回答@MRocklin,但是,我想把它们放在一个袋子里,因为在一个步骤中,我需要在这些切片和一个相当大的袋子之间执行笛卡尔积,然后执行更复杂的计算。你介意我提交一个关于github-Dask回购的问题来提供更多细节吗?