我有以下问题。我有一个庞大的csv文件,想通过多处理程序加载它。对于具有500,000行和130个具有不同dtypes的列的示例文件,熊猫需要19秒。我尝试了dask,因为我想对阅读进行多处理。但这花费了更长的时间,我想知道为什么。我有32个核心。并尝试了这个:
import dask.dataframe as dd
import dask.multiprocessing
dask.config.set(scheduler='processes')
df = dd.read_csv(filepath,
sep='\t',
blocksize=1000000,
)
df = df.compute(scheduler='processes') # convert to pandas
答案 0 :(得分:3)
从磁盘读取大文件时,瓶颈是IO。由于使用C解析引擎对Pandas进行了高度优化,因此收获不多。使用多处理或多线程的任何尝试都可能会降低性能,因为您将花费相同的时间从磁盘加载数据,并且只会增加一些同步不同进程或线程的开销。
答案 1 :(得分:0)
您可以使用mutliprocessthing,但是就像文件没有被剪切一样,当程序/线程想要访问文件时(可能会发生这种情况),您可能要等待。
如果要正确使用多重处理,我建议您将文件切成不同的部分,并在最终操作中合并所有结果
答案 2 :(得分:0)
考虑这意味着什么:
df = df.compute(scheduler ='processes')
短篇小说:如果您唯一的工作是在内存中获取Pandas数据帧,请不要使用Dask,这只会增加开销。 请使用Dask(如果您可以独立地对块进行操作,并且仅在客户端中收集 small 输出(例如,groupby-aggregate等)。
答案 3 :(得分:0)
我建议使用num_workers
关键字参数尝试不同数量的进程进行计算。
与上面所说的相反,read_csv绝对是受计算限制的,并行运行几个进程可能会有所帮助。
但是,同时有太多进程同时敲打磁盘可能会引起很多争用并使速度变慢。
我建议对不同数量的过程进行一些试验,以了解最有效的方法。