pd.read_csv,然后并行pd.concat处理多个txt文件

时间:2018-09-26 12:20:23

标签: python-3.x parallel-processing multiprocessing dask

我找不到专门针对此的任何东西,而且似乎也没有任何组合来完成我需要的操作而没有错误。

我需要读取具有特定命名约定的十几个或更多txt文件(在四个文件夹中,因此使用递归方法),然后将它们全部合并在一起。所有文件具有相同的列名,但每个文件的长度都不同。

这是我现在可以执行并使其运行但想要并行运行的方式:

 path1 = my specific filepath

 file_list = glob.glob(os.path.join(path1, "*\\XT*.txt"), recursive = 
             True)

 df_each = (pd.read_csv(f, sep = '|') for f in file_list)

 df = pd.concat(df_each, ignore_index = True)

然后有一些小事情需要清理和更改,我已经这样做了:

 df.replace{("#":""}, regex = True, inplace = True

 df.columns = df.columns.str.replace("#", "")

我需要的所有文件的最终目的是对每列的总和进行汇总,并按以下方式进行专门分组:

 df_calc = df.groupby(['Name1', 'Name2']).sum()

现在大约需要30分钟才能运行,并且希望并行运行以减少此时间。谢谢!

1 个答案:

答案 0 :(得分:1)

您在评论中提到您的CPU使用率很低,不是100%。这意味着您受到磁盘吞吐量或内存带宽的限制。因此,分配更多的CPU内核来执行此任务只会减慢它的速度。相反,您应该集中精力减少IO和内存消耗。

使用usecols的{​​{1}}选项是一个很好的开始。另外,请尝试传递pd.read_csv()和显式engine='c'以避免熊猫每次都猜测dtype。

您还可能会受益于SSD。

您还应该考虑以更有效的格式存储数据。例如dtype和朋友产生的格式。这样可以将加载速度提高100倍。