Python 使用dask通过深部处理大型堆栈

Python 使用dask通过深部处理大型堆栈,python,dask,Python,Dask,我尝试处理一个大堆栈(我从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, a

我尝试处理一个大堆栈(我从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.array导入为da
将numpy作为np导入
从dask导入延迟
延迟列表=[延迟(np.full)((10001000),填充)
填写[1,2,3,np.nan]]
da_list=[da.from_delayed(d,shape=(10001000),dtype=float)
对于延迟列表中的d]
stack=da.stack(da_列表,轴=2)
>>>堆叠
dask阵列
到目前为止你还没有做任何工作。您从未调用过
np.full
(或任何函数)。Dask只有在您告诉它时才会开始调用这些函数,例如,当您调用
.compute()
时。但是,它将按顺序调用这些函数,以便在调用更多函数之前,能够将一些大型数组处理为小型数组(例如使用
nanmean

这篇博文可能会提供更多信息:

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)>