我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于具有 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我尝试了 dask,因为我想对阅读进行多处理。但这需要更长的时间,我想知道为什么。我有 32 个内核。并尝试了这个:import dask.dataframe as ddimport dask.multiprocessingdask.config.set(scheduler='processes')df = dd.read_csv(filepath, sep='\t', blocksize=1000000, )df = df.compute(scheduler='processes') # convert to pandas
3 回答
白衣染霜花
TA贡献1796条经验 获得超10个赞
从磁盘读取大文件时,瓶颈是IO。由于 Pandas 使用 C 解析引擎进行了高度优化,因此收益很少。任何使用多处理或多线程的尝试都可能降低性能,因为您将花费相同的时间从磁盘加载数据,并且只会增加一些用于同步不同进程或线程的开销。
绝地无双
TA贡献1946条经验 获得超4个赞
考虑一下这意味着什么:
df = df.compute(scheduler='processes')
每个进程访问一些原始数据块。这可能是并行的,或者很可能受底层存储设备的 IO 限制
每个进程都从它的数据中生成一个数据帧,这是 CPU 密集型的,并且可以很好地并行化
每个块都由进程序列化并从您调用它的地方传达给客户端
客户端反序列化块并为您连接它们。
小故事:如果您唯一的工作是在内存中获取 Pandas 数据帧,请不要使用 Dask,它只会增加开销。不要使用DASK,如果你可以在块独立运作,并只收取少量的客户端输出(例如,GROUPBY骨料等)。
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
我建议使用num_workers
关键字参数尝试不同数量的进程来计算。
与上面所说的相反, read_csv 绝对是受计算限制的,并且让几个进程并行工作可能会有所帮助。
但是,同时在磁盘上运行太多进程可能会导致大量争用并减慢速度。
我建议对不同数量的进程进行一些试验,看看哪种效果最好。
添加回答
举报
0/150
提交
取消