dask dataframe groupby导致一个分区内存问题

时间:2019-04-24 20:51:10

标签: group-by dask dask-distributed

我正在将64个压缩的csv文件(大约70-80 GB)读入一个dask数据帧,然后使用聚合运行groupby。

该作业从未完成,因为groupby显然只创建了一个分区的数据帧。

This postthis post已经解决了这个问题,但是当结果数据帧太大时,只关注计算图而不是遇到的内存问题。

我尝试了重新分区的解决方法,但这项工作仍无法完成。

我在做什么错,我必须使用map_partition吗?这非常令人困惑,因为我希望Dask即使在聚合操作之后也能对所有内容进行分区。

    from dask.distributed import Client, progress
    client = Client(n_workers=4, threads_per_worker=1, memory_limit='8GB',diagnostics_port=5000)
    client

    dask.config.set(scheduler='processes')
    dB3 = dd.read_csv("boden/expansion*.csv",  # read in parallel
                 blocksize=None, # 64 files
                 sep=',',
                 compression='gzip'
    )

    aggs = {
      'boden': ['count','min']
    }
    dBSelect=dB3.groupby(['lng','lat']).agg(aggs).repartition(npartitions=64) 
    dBSelect=dBSelect.reset_index()
    dBSelect.columns=['lng','lat','bodenCount','boden']
    dBSelect=dBSelect.drop('bodenCount',axis=1)
    with ProgressBar(dt=30): dBSelect.compute().to_parquet('boden/final/boden_final.parq',compression=None)  

1 个答案:

答案 0 :(得分:1)

大多数groupby聚合输出很小,很容易放在一个分区中。显然,您的情况并非如此。

要解决此问题,您应该在groupby聚合中使用split_out=参数来请求一定数量的输出分区。

df.groupby(['x', 'y', 'z']).mean(split_out=10)

请注意,使用split_out=将大大增加任务图的大小(它必须提前对数据进行轻洗/排序),因此可能会增加调度开销。