集群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
键不相交,也就是说,如果一组键位于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)