dask.distributed不利用群集

时间:2019-11-30 08:49:31

标签: dask dask-distributed dask-delayed

我无法使用分布式集群来处理此块。

import pandas as pd
from dask import dataframe as dd 
import dask

df = pd.DataFrame({'reid_encod': [[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]]})
dask_df = dd.from_pandas(df, npartitions=3)
save_val = []
def add(dask_df):
    for _, outer_row in dask_df.iterrows():
        for _, inner_row in dask_df.iterrows():
            for base_encod in outer_row['reid_encod']:
               for compare_encod in inner_row['reid_encod']:
                   val = base_encod + compare_encod
                   save_val.append(val)
    return save_val

from dask.distributed import Client

client = Client(...)
dask_compute = dask.delayed(add)(dask_df)
dask_compute.compute()

我的查询也很少

  1. dask.delayed是否使用可用的群集进行计算。

  2. 我可以使用延迟来并行化此熊猫DF的for循环迭代,并使用群集中存在的多台计算机进行计算。

  3. 在熊猫数据框上进行分布式操作。

  4. 我们可以在dask.distributed中使用dask.delayed吗?

  5. 如果上述编程方法不正确,是否可以指导我为上述情况选择延迟还是慢速DF。

2 个答案:

答案 0 :(得分:3)

记录下来,一些答案,尽管我想指出我先前关于这个问题的一般观点

  

dask.delayed是否使用可用的群集进行计算。

如果您已经为分布式集群创建了客户端,除非您另外指定,dask会将其用于计算。

  

我可以使用延迟来并行化此熊猫DF的for循环迭代,并使用群集中存在的多台计算机进行计算。

是的,如果您愿意,通常可以将pandas数据帧延迟用于并行处理。但是,您的数据框只有一行,因此在这种情况下如何并不明显-它取决于您真正想要实现的目标。

  

在熊猫数据框上进行分布式操作。

是的,您可以执行python可以执行的所有分布式操作,因为这只是执行代码的python进程。是否为您带来理想的表现是一个单独的问题

  

我们可以在dask.distributed中使用dask.delayed吗?

是的,分布式可以执行普通的任务,包括延迟的函数/对象

  

如果上述编程方法不正确,是否可以指导我为上述情况选择延迟还是慢速DF。

不容易,对我来说这根本不是一个数据帧操作。似乎更像一个数组-但是,再次提醒您,您的函数实际上根本没有返回任何有用的东西。

在教程中:passing pandas dataframes to delayedsame with dataframe API

答案 1 :(得分:2)

您的代码的主要问题在最佳实践的this section中进行了概述:不要将Dask集合传递给延迟的函数。这意味着,您应该使用 delayed API dataframe API。虽然您可以转换延迟的数据帧,但不建议像这样简单地传递。

此外,

  • 您的数据帧中只有一行,因此您只会得到一个分区,而没有并行性。您只能像这样放慢速度。
  • 这似乎是一个万能的操作(N ^ 2),因此,如果您有很多行(Dask的正常情况),那么无论您使用了多少个内核,都将花费非常长的时间
  • 在熊猫行中传递列表不是一个好主意,也许您想使用数组?
  • 该函数不会返回任何有用的信息,因此根本不清楚您要实现的目标。在MVCE的描述下,您将看到对“预期结果”和“出了什么问题”的引用。要获得更多帮助,请更加精确。