Python 使用dask通过深部处理大型堆栈
我尝试处理一个大堆栈(我从landsat获取阵列并制作堆栈,时空像一个3d矩阵),这是一个小示例: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
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)>