map_block 和 map_overlap 之间的处理时间差异是否是由于 dask.array 到 np.array 的转换?
Difference in processing time between map_block and map_overlap is it due to dask.array to np.array conversion?
简介
我有一个由 42 个平面组成的图像堆栈 (ImgStack
),每个平面为 2048x2048 像素,还有一个用于分析的函数:
def All(ImgStack):
some filtering
more filtering
我确定使用 dask(在我的计算机上)处理数组的最有效方法是 chunks=(21,256,256)
.
当我运行map_blocks
:
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
g=da.ghost.ghost(z, depth={0:10, 1:50,2:50},boundary={0: 'periodic',1:'periodic',2:'periodic'})
g2=g.map_blocks(All)
result = da.ghost.trim_internal(g2, {0: 10, 1: 50,2:50})
print('Time=',str(time.time()-now))
时间=1.7090258598327637
相反,当我 运行 map_overlap
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
y=z.map_overlap(All,depth={0:10, 1:50,2:50},boundary={0: 'periodic', 1: 'periodic',2:'periodic'})
y.compute()
print('Time=',str(time.time()-now))
时间=228.19104409217834
我猜较大的时差是由于 map_overlap 中从 dask.array 到 np.array 的转换,因为如果我将转换步骤添加到 map_block 脚本中执行时间变得可比。
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
g=da.ghost.ghost(z, depth={0:10, 1:50,2:50},boundary={0: 'periodic', 1: 'periodic',2:'periodic'})
g2=g.map_blocks(All)
result = da.ghost.trim_internal(g2, {0: 10, 1: 50,2:50})
I=np.array(result)
print('Time=',str(time.time()-now))
时间=209.68917989730835
问题
所以最好的方法是保留 dask.array 但是当我将数据保存在 h5 文件中时问题出现了:
now=time.time()
result.to_hdf5('/Users/simone/Downloads/test.h5','/Dask2',compression='lzf')
print('Time=',str(time.time()-now))
时间=243.1597340106964
但是如果我保存相应的np.array
test=h5.File('/Users/simone/Downloads/test.h5','r+')
DT=test.require_group('NP')
DT.create_dataset('t', data=I,dtype=I.dtype,compression="lzf")
now=time.time()
print('Time=',str(time.time()-now))
时间=时间=4.887580871582031e-05
问题
所以我希望能够 运行 在尽可能短的时间内过滤和保存数组。有没有办法加快从 dask.array--> np.array() 的转换或加快 da.to_hdf5?
谢谢!任何评论将不胜感激。
在您的快速示例中,您实际上从未 compute
结果。一秒钟只是建立计算图所花费的时间。在我看来,您的计算确实需要 200 秒左右。
如果您想更好地了解什么占用了时间,您可以尝试使用 dask profiler。
简介
我有一个由 42 个平面组成的图像堆栈 (ImgStack
),每个平面为 2048x2048 像素,还有一个用于分析的函数:
def All(ImgStack):
some filtering
more filtering
我确定使用 dask(在我的计算机上)处理数组的最有效方法是 chunks=(21,256,256)
.
当我运行map_blocks
:
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
g=da.ghost.ghost(z, depth={0:10, 1:50,2:50},boundary={0: 'periodic',1:'periodic',2:'periodic'})
g2=g.map_blocks(All)
result = da.ghost.trim_internal(g2, {0: 10, 1: 50,2:50})
print('Time=',str(time.time()-now))
时间=1.7090258598327637
相反,当我 运行 map_overlap
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
y=z.map_overlap(All,depth={0:10, 1:50,2:50},boundary={0: 'periodic', 1: 'periodic',2:'periodic'})
y.compute()
print('Time=',str(time.time()-now))
时间=228.19104409217834
我猜较大的时差是由于 map_overlap 中从 dask.array 到 np.array 的转换,因为如果我将转换步骤添加到 map_block 脚本中执行时间变得可比。
now=time.time()
z=da.from_array(ImgStack,chunks=(21,256,256))
g=da.ghost.ghost(z, depth={0:10, 1:50,2:50},boundary={0: 'periodic', 1: 'periodic',2:'periodic'})
g2=g.map_blocks(All)
result = da.ghost.trim_internal(g2, {0: 10, 1: 50,2:50})
I=np.array(result)
print('Time=',str(time.time()-now))
时间=209.68917989730835
问题
所以最好的方法是保留 dask.array 但是当我将数据保存在 h5 文件中时问题出现了:
now=time.time()
result.to_hdf5('/Users/simone/Downloads/test.h5','/Dask2',compression='lzf')
print('Time=',str(time.time()-now))
时间=243.1597340106964
但是如果我保存相应的np.array
test=h5.File('/Users/simone/Downloads/test.h5','r+')
DT=test.require_group('NP')
DT.create_dataset('t', data=I,dtype=I.dtype,compression="lzf")
now=time.time()
print('Time=',str(time.time()-now))
时间=时间=4.887580871582031e-05
问题
所以我希望能够 运行 在尽可能短的时间内过滤和保存数组。有没有办法加快从 dask.array--> np.array() 的转换或加快 da.to_hdf5?
谢谢!任何评论将不胜感激。
在您的快速示例中,您实际上从未 compute
结果。一秒钟只是建立计算图所花费的时间。在我看来,您的计算确实需要 200 秒左右。
如果您想更好地了解什么占用了时间,您可以尝试使用 dask profiler。