我尝试处理一个大堆栈(我从 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
关于python - 使用 daa 深度处理大堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214714/