我尝试处理一个大堆栈(我从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

10-06 05:22
查看更多