我尝试处理一个大堆栈(我从landsat获取数组并像3d矩阵一样时空制作堆栈),这是一个小例子:
import dask.array as da
import numpy as np
da_list = [da.from_array(np.full((int(1e3), int(1e3)), fill), (1000,1000)) for fill in [1,2,3,np.nan]]
stack = da.dstack(da_list)
print(da.nanmean(stack, axis=2).compute())
这个过程很好,但是如果堆栈更大,它将整个堆栈加载到内存中进行处理:
import dask.array as da
import numpy as np
da_list = [da.from_array(np.full((int(1e5), int(1e5)), fill), (1000,1000)) for fill in [1,2,3,np.nan]]
stack = da.dstack(da_list)
print(da.nanmean(stack, axis=2).compute())
但是,这需要大量内存用于处理,什么是并行处理的最佳方法,而不需要大量内存用于处理?谢谢
最佳答案
首先,如果您确实需要np.full
,则应该只使用da.full
。但是,我假设您只是使用np.full
作为其他一些生成numpy数组的函数的示例。
答案是您不能立即调用函数,需要延迟调用它,直到真正需要结果为止。为此,请使用dask.delayed
import dask.array as da
import numpy as np
from dask import delayed
delayed_list = [delayed(np.full)((1000, 1000), fill)
for fill in [1, 2, 3, np.nan]]
da_list = [da.from_delayed(d, shape=(1000, 1000), dtype=float)
for d in delayed_list]
stack = da.stack(da_list, axis=2)
>>> stack
dask.array<stack-0..., shape=(1000, 1000, 4), dtype=float64, chunksize=(1000, 1000, 1)>
到目前为止,您实际上还没有完成任何工作。您从未调用过
np.full
(或任何函数)。一旦告知,Dask只会开始调用这些函数,例如,当您调用.compute()
时。但是,它将按顺序调用这些函数,以便希望在调用更多函数之前,可以处理一些大数组,直到小数组(例如,使用nanmean
)。该博客文章可能会提供更多信息:http://matthewrocklin.com/blog/work/2017/01/17/dask-images