【问题标题】:How to reduce a processing time - parallelize pandas dataframe?如何减少处理时间 - 并行化 pandas 数据帧?
【发布时间】:2017-09-15 10:13:27
【问题描述】:

我正在访问一个包含超过 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 数据帧,但没有找到任何好的材料。

【问题讨论】:

  • basic_clean('Fam name') 在做什么?如果不了解您的代码的作用,我们如何提供帮助?
  • 我不确定这是否符合您的想法:df['3.3'] == 1
  • @IanS 有一个名为 3.3 的列,它正在检查它的值是否为 1。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我上面提到的 basic_clean() 方法接受一个字符串参数并返回其大写值
  • 为什么需要一个函数呢?您是否将其作为列名传递?能否请您展示一些我们可以使用的数据?

标签: python database pandas dataframe parallel-processing


【解决方案1】:

如何减少处理时间?

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

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

由于极高的 IO 延迟(fileIO 为 ~ 10+ [ms] 而 CPU/MEM-IO 为 ~ [ns])、难以管理的数据流带宽和由于容易发生资源争用(阻塞)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-01-01
    • 2017-07-23
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多