python - 使用 daa 深度处理大堆栈

标签 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, 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/

相关文章:

python - 可以在 Python 中声明一个抽象异常吗?

python - 如何在不同的线程中生成异常

python - Celery 将任务路由到错误的工作服务器

python - 带有 numpy 数组的 dask bag foldby

python - Dask:无法从单独的 multiprocessing.Process 向全局客户端提交任务

python - 我如何计算特定价格的费用?

python-3.x - Dask 使用 future 计算子图

tensorflow - Dask DataFrame - Keras 模型的预测

python - Dask 分布式客户端 - 错误 - 10 秒后无法重新连接到调度程序,正在关闭客户端

Python 等待 x 秒等待一个键,如果没有按下则继续执行