如何减少处理时间 - 并行化pandas数据帧?

时间:2017-09-15 10:13:28

标签: python database pandas dataframe parallel-processing

我正在访问一个包含超过2000万行和200多列的大型CSV文件。

我的代码在以下部分花了太多时间:

def Myfunction(df):
   if df['3.3'] ==  1 or df['2.3'] ==  1 or df['1.3'] ==  1 or df['4'] == 1:
       df['A1'] = 'A1'
       df['AZ B1'] = df[basic_clean('AZ col')]
       df['CZ Cat'] = df[basic_clean('Cate name')]
       df['CZ Sub'] = df[basic_clean('SubName')]
       df['CZ Com'] = df[basic_clean('Comm_Name')]

   else:
       df['A1'] = 'Not A1'
       df['AZ B1'] = df[basic_clean('Fam name')]
       df['CZ Cat'] = df[basic_clean('C Name')]
       df['CZ Sub'] = df[basic_clean('Sub Name')]
       df['CZ Com'] = df[basic_clean('C Name')]
   return df

这里,basic_clean()是一个函数,它将文本格式化(大写),不需要太多时间。我在某处读到了使用并行化pandas数据帧的方法,但对此没有任何好的材料。

1 个答案:

答案 0 :(得分:0)

如何缩短处理时间?

在上述用例中,最好的改进将来自最初的一次性预转换所述CSV - 文件-A到CSV - 文件-B。在大多数情况下,基于“流”的大文件处理将更快,因为所有转换流 - “对齐”并且文件IO-“对齐”并且流处理将展示最小化的文件IO /数据流开销(无论是旋转磁盘,SSD,NAS还是其他类型的远程文件访问)。此步骤的良好实施可以保证最小的进程延迟,并且还可以有效地屏蔽转换后的文件后处理进程(导入程序)中的大部分步骤延迟。 (已经在巨大的telco-CDR-stream处理中使用了这种方法(比一些〜[2E+7,2E+2]文件的扩展方式更大,所以可以肯定我可以比较好,更好,只是 - 大规模和差的方法))

完成了预转换步骤后,python-side将不再承担任何此类块工作负载,只会处理从“正确”预格式化CSV - file-B导入的数据帧。

文件IO绑定操作的并行性在大多数情况下都无济于事,因为IO延迟极高(对于fileIO而言为~10 + [ms]而不是CPU / MEM-IO的〜[ns]),数据流带宽无法控制,由于容易资源争用(阻塞)。