集群dask的并行化

集群dask的并行化,dask,dask-distributed,Dask,Dask Distributed,我正在寻找在集群上并行处理以下问题的最佳方法。我有几个档案 文件夹/file001.csv 文件夹/file002.csv : 文件夹/file100.csv 它们与我要用于groupby的键不相交,也就是说,如果一组键位于file1.csv中,则这些键中的任何一个键在任何其他文件中都有一个项 一边我可以跑 df = dd.read_csv("folder/*") df.groupby("key").apply(f, meta=meta).compute(scheduler='process

我正在寻找在集群上并行处理以下问题的最佳方法。我有几个档案

  • 文件夹/file001.csv
  • 文件夹/file002.csv
  • :
  • 文件夹/file100.csv
它们与我要用于groupby的
键不相交,也就是说,如果一组键位于
file1.csv
中,则这些键中的任何一个键在任何其他文件中都有一个项

一边我可以跑

df = dd.read_csv("folder/*")
df.groupby("key").apply(f, meta=meta).compute(scheduler='processes') 
但我想知道是否有更好/更聪明的方法在某种程度上做到这一点 对

每个
filexxx.csv
都适合节点上的内存。考虑到每个节点都有
n
个核心,最好使用所有核心。对于每一个文件,我都可以这样使用

同样,我也不确定是否有一种有效的dask方法可以做到这一点。

您可以使用(默认情况下将在多进程中运行)并使用特定的
块大小读取数据。您可以使用该方法获得工人数量(以及每个工人的核心数量),然后计算最佳的
块大小

但是,根据
的规定,默认情况下,blocksize
是“基于可用物理内存和内核数计算的”

因此,我认为最好的方法是:

from distributed import Client
# if you run on a single machine just do: client = Client()
client = Client('cluster_scheduler_path')
ddf = dd.read_csv("folder/*")
编辑:之后使用
映射分区
,并对每个分区执行以下操作:

# Note ddf is a dask dataframe and df is a pandas dataframe 
new_ddf = ddf.map_partitions(lambda df: df.groupby("key").apply(f), meta=meta)

不要使用
compute
,因为它会产生一个
pandas.dataframe
,而是使用
dask
方法来保持整个过程的并行性和与ram兼容

谢谢你的回答,但我的问题指向另一个方向。在我的情况下,这个问题应该是令人尴尬的并行问题,并且使用
dask.dataframe
我想我不需要洗牌。您可以将索引设置为
列,然后根据它的值(使用
分区
kwarg)重新分区,然后使用
映射分区
。这样就实现了完全的并行计算。我会尝试,但我觉得
set\u index
会很昂贵。会的,我也遇到过类似的情况,这是我能想到的最好的办法。然而,在你这么做之前,我建议阅读哦,对不起,我误解了你。将在答案中编辑。
# Note ddf is a dask dataframe and df is a pandas dataframe 
new_ddf = ddf.map_partitions(lambda df: df.groupby("key").apply(f), meta=meta)