达斯阅读CSV与熊猫阅读CSV

时间:2019-02-22 09:09:57

标签: python pandas csv dask

我有以下问题。我有一个庞大的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

4 个答案:

答案 0 :(得分:3)

从磁盘读取大文件时,瓶颈是IO。由于使用C解析引擎对Pandas进行了高度优化,因此收获不多。使用多处理或多线程的任何尝试都可能会降低性能,因为您将花费相同的时间从磁盘加载数据,并且只会增加一些同步不同进程或线程的开销。

答案 1 :(得分:0)

您可以使用mutliprocessthing,但是就像文件没有被剪切一样,当程序/线程想要访问文件时(可能会发生这种情况),您可能要等待。

如果要正确使用多重处理,我建议您将文件切成不同的部分,并在最终操作中合并所有结果

答案 2 :(得分:0)

考虑这意味着什么:

  

df = df.compute(scheduler ='processes')

  • 每个进程都访问一些原始数据。这可能是并行的,或者很可能受到基础存储设备IO的限制
  • 每个进程都根据其数据创建一个数据帧,这是CPU负担很重的,并且可以很好地并行化
  • 每个块都由流程序列化,并从您调用它的位置传达给客户端
  • 客户端反序列化这些块并为您串联它们。

短篇小说:如果您唯一的工作是在内存中获取Pandas数据帧,请不要使用Dask,这只会增加开销。 使用Dask(如果您可以独立地对块进行操作,并且仅在客户端中收集 small 输出(例如,groupby-aggregate等)。

答案 3 :(得分:0)

我建议使用num_workers关键字参数尝试不同数量的进程进行计算。

与上面所说的相反,read_csv绝对是受计算限制的,并行运行几个进程可能会有所帮助。

但是,同时有太多进程同时敲打磁盘可能会引起很多争用并使速度变慢。

我建议对不同数量的过程进行一些试验,以了解最有效的方法。