我正在将64个压缩的csv文件(大约70-80 GB)读入一个dask数据帧,然后使用聚合运行groupby。
该作业从未完成,因为groupby显然只创建了一个分区的数据帧。
This post和this 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)
答案 0 :(得分:1)
大多数groupby聚合输出很小,很容易放在一个分区中。显然,您的情况并非如此。
要解决此问题,您应该在groupby聚合中使用split_out=
参数来请求一定数量的输出分区。
df.groupby(['x', 'y', 'z']).mean(split_out=10)
请注意,使用split_out=
将大大增加任务图的大小(它必须提前对数据进行轻洗/排序),因此可能会增加调度开销。