Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Dask.array高效地向集群发送大型numpy阵列_Numpy_Dask - Fatal编程技术网

如何使用Dask.array高效地向集群发送大型numpy阵列

如何使用Dask.array高效地向集群发送大型numpy阵列,numpy,dask,Numpy,Dask,我在本地机器上有一个大的NumPy数组,我想在集群上与Dask.array并行 import numpy as np x = np.random.random((1000, 1000, 1000)) 然而,当我使用dask.array时,我发现我的调度程序开始占用大量RAM。为什么会这样?这些数据不应该给工人们吗 import dask.array as da x = da.from_array(x, chunks=(100, 100, 100)) from dask.distributed

我在本地机器上有一个大的NumPy数组,我想在集群上与Dask.array并行

import numpy as np
x = np.random.random((1000, 1000, 1000))
然而,当我使用dask.array时,我发现我的调度程序开始占用大量RAM。为什么会这样?这些数据不应该给工人们吗

import dask.array as da
x = da.from_array(x, chunks=(100, 100, 100))

from dask.distributed import Client
client = Client(...)
x = x.persist()

无论何时
持久化
计算
一个Dask集合,该集合的数据都会发送到调度程序,并从调度程序发送到工作进程。如果要绕过在调度程序上存储数据,则必须学习如何使用

您有三种选择:

  • 不要在客户端计算机上加载数据
  • 散开然后大块
  • 然后散开
  • 不要在客户端计算机上加载数据 最好的方法是将加载数据作为计算的一部分,而不是在本地进行

    之前 之后 有关创建dask阵列的更多信息,请参见:

    散开然后大块 您可以将numpy阵列直接分散到辅助对象

    future = client.scatter(x)
    x = da.from_delayed(future, shape=x.shape, dtype=x.dtype)
    x = x.rechunk((100, 100, 100))
    x = x.persist()
    
    这会将您的数据直接移动到工作区,然后从那里进行块处理。这很好,因为它绕过了调度程序。但是,如果您的工作人员开始失败,您现在就有数据丢失的风险。只有当你处在一个大规模并行系统中时,这才重要

    这也有点低效,因为您的所有数据都集中在一个工作者身上,而不是分散。您可以调用
    client.rebalance
    或继续阅读

    然后散开 您可以使用本地调度程序在本地对数据进行分块,然后分散到集群

    x = da.from_array(x, chunks=(100, 100, 100))
    x = x.persist(get=dask.threaded.get)  # chunk locally
    futures = client.scatter(dict(x.dask))  # scatter chunks
    x.dask = x  # re-attach scattered futures as task graph
    
    留在当地 或者,您可以继续在本地使用dask,或者与线程调度程序一起使用,或者与仅使用本地进程的分布式调度程序一起使用

    client = Client(processes=False)
    
    这将停止本地进程、调度程序和工作进程之间不必要的数据复制。它们现在都在同一个本地进程中

    client = Client(processes=False)
    
    另请参见:以获取此答案的基于任务的版本

    client = Client(processes=False)