【问题标题】:Python GPU programming for bulk simple calculations with Pandas使用 Pandas 进行批量简单计算的 Python GPU 编程
【发布时间】:2019-11-21 21:35:04
【问题描述】:

Excel 中的 3 列原始数据(如屏幕截图)。该脚本是通过一个带有列的简单公式来计算结果。当结果达到限制时,它会打印结果。

import pandas as pd

df = pd.read_excel("C:\excel_file.xlsx", sheet_name = "Sheet1")

P1 = df['Period 1']
P2 = df['Period 2']
P3 = df['Period 3']

df['Predict'] = 12.5 + (0.35 * P1 + 0.5 * P2 + 0.8 * P3)

for index, row in df.iterrows():
    if row['Predict'] >= 100:
        print row['SKU and Product code']

问题:一个文件中有很多行,并且有 > 100k 个文件。现在完成 1 次运行大约需要 3 天。

计算和逻辑很简单。但是对于这种频繁的任务,数据量和文件数量都很大。

当原始数据中没有其他选项时(不减少行数和文件数)。我想知道 GPU 编程是否是缩短处理时间的一种选择。

我在 Google 上搜索,翻阅了一本书,发现 GPU 编程更适用于机器学习等高级任务。

如果可以在这种情况下使用 GPU 编程,上面的重写代码看起来如何?谢谢。

【问题讨论】:

  • “many rows”表示多少行?
  • @Sraw,感谢您的评论。每个文件的行数从 600 到 3500 不等。
  • 嗯,我不认为真的有“很多”行。在这种情况下,我认为 GPU 不会真正帮助你。您应该首先监控您的 CPU 使用率,如果它较低,请先尝试使用multiprocessing
  • @Sraw,我现在将文件分组并有多个脚本执行类似的任务。 CPU 使用率已经 100%。
  • 好吧,由于信息有限,我无法提供更多建议。但至少 GPU 不是你的救星。可能有很多原因,例如您的磁盘速度较慢,或者您应该考虑使用更快的 Excel 文件阅读器。见一些亲戚:stackoverflow.com/questions/50695778/…

标签: python pandas gpu


【解决方案1】:

您的计算是否真的“返回所有符合此条件的行”? (我不是熊猫专业人士,所以可能会遗漏一些东西)。如果我没看错的话,6000 次乘法和比较应该花费不到一秒钟的时间。在一个快速的实验中,在我便宜的笔记本电脑上,一秒钟的数据长度约为 70 万行。

但是,一天只有 86,400 秒 - 所以即使每个文件需要 1 秒来加载,这里也太多了!从类似的快速实验中,csv 只需 25k 行长,就可以使从文件中读取数据需要更长的时间。这是一个有用的提示——在这种情况下,读取文件主导了计算,因此我们可以针对这一点。

当我们有这样的工作时,有几种通用方法。并行化是第一个。如果我们一次可以处理 10 个文件,那么在每个需要 1 秒的情况下,这会使我们减少到大约 2 个小时。这……可能是不可能的。我们会在某个时候使磁盘饱和......但在这种情况下,我们希望磁盘成为瓶颈。为此,您将使用多处理线程池,将文件的名称传递到工作队列中。 (您不想读取数据并传递数据——读取数据是您的瓶颈)。

假设该增益存在限制,下一步是分配。这些文件存储在哪里?如果它们在 s3 或 NFS 或类似的东西上,您可以轻松地使用类似 fabric 的东西在多台机器上运行脚本。 10 台机器,每台机器一次做 10 个,将我们从几小时缩短到几分钟,这可能就足够了。

但是,还有一个更好的技巧 - 大概这 100k 文件并不是每天都在创建新的。将它们加载到专为分布式并行计算设计的系统中,例如 BigQuery、Redshift 或带有 HDFS 的 Hadoop/Spark。然后,工作的“阅读”部分只需每天对新文件进行新的处理,您就可以运行计算。

【讨论】:

    【解决方案2】:

    Python 是一种解释器语言。可能使用诸如 C 之类的编译语言会更快。但这意味着从头开始。使用 C 的代码变得更加复杂,因为您必须使用指针。 (除非您可以在每一行之后丢弃数据。因此您在内存中的数据仍然有限) 此外,我必须承认我从未使用 C 来读取 Exel 表。 可能您的代码实际上需要大部分时间来读取和提取 EXEL 文件,而计算并不重要。如果读取时间占主导地位,甚至 C 可能很快就会达到它的极限。 尝试数据是在慢速硬盘还是在快速 (SSD) 磁盘上是否存在差异。

    【讨论】:

    • 我正在使用相当不错的计算机(CPU、硬盘、RAM 和显卡硬件都高于一般标准)来完成这项任务。
    • 这个答案基本上是“哦,好吧,它的python的错”......显然不是这样,因为python(包括许多高度优化的第三方库)用于绝大多数专业数据处理任务。
    • 补充 PaulBecotte 的评论:numpy 和 pandas 库的性能关键内部部分实际上是作为预编译的 C 代码实现的。
    【解决方案3】:

    您还可以优化现有的 Python 代码。我敢肯定,当您将 iterrows() 循环替换为纯矢量化操作时,您会看到显着的计算性能提升:

    import pandas as pd
    
    df = pd.read_excel(r"C:\excel_file.xlsx", sheet_name="Sheet1")
    
    df['Predict'] = 12.5 + (0.35 * df['Period 1'] + 0.5 * df['Period 2'] + 0.8 * df['Period 3'])
    
    row_mask = df['Predict'] >= 100
    target_columns = ['SKU and Product code', 'Period 1', 'Period 2', 'Period 3']
    df2 = df.loc[row_mask, target_columns]
    
    print(df2)
    

    如果您的性能瓶颈在于磁盘的 I/O 操作,那么它不会对整体执行时间造成很大影响。然而,由于这是一个相当快速和直接的代码更改,我认为无论如何都值得一试。

    PS:我建议养成始终编写 vectorized pandas 操作而不是使用 for 循环的 pandas 操作的习惯 这基本上是 pandas 的意图被使用,什么给你最好的计算速度。请参阅 herehere 了解有关 pandas python 代码优化的一些好的指南。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 2016-02-27
      • 2012-03-02
      • 1970-01-01
      • 2019-02-25
      • 2012-06-23
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多