【问题标题】:Can I use Python multiprocessing to get this to run faster on windows我可以使用 Python 多处理来让它在 Windows 上运行得更快吗
【发布时间】:2017-10-16 18:12:33
【问题描述】:

我很难理解如何利用/学习如何在我的 Python 代码中使用多处理。我现在正在处理 csv 文件,这些文件是 Windows 操作系统上的几场演出和数千万条记录,并且开始遇到巨大的处理速度提升。我有以下代码:

import numpy as np
import pandas as pd
import datetime as dt

df = pd.read_csv(r'C:...\2017_import.csv')

df['FinalActualDate'] =  pd.to_datetime(df['FinalActualDate'])
df['StartDate'] =  pd.to_datetime(df['StartDate'])

df['DaysToInHome'] = (df['FinalActualDate'] - df['StartDate']).abs()  / np.timedelta64(1, 'D')

df.to_csv(r'C:...\2017_output4.csv', index=False)  

存档的数据为 3.6 gigs。数据如下:

Class,OwnerCode,Vendor,Campaign,Cycle,Channel,Product,Week,FinalActualDate,State,StartDate
3,ECM,VendorA,000206,06-17,A,ProductB,Initial,2017-06-14 02:01:00,NE,06-01-17 12:00:00
3,ECM,VendorB,000106,06-17,A,ProductA,Initial,2017-06-14 00:15:00,NY,06-01-17 12:00:00
3,ECM,AID,ED-17-0002-06,06-17,B,ProductB,Secondary,2017-06-13 20:30:00,MA,06-08-17 12:00:00
3,ECM,AID,ED-17-0002-06,06-17,C,ProductA,Third,2017-06-15 02:13:00,NE,06-15-17 12:00:00

此代码适用于小型数据集,但在实际的大型数据集上需要几个小时。我已经尝试了多次导入 concurrent.futures 和 multiprocessing 的迭代,但都没有成功。我很迷茫,不值得我发布我尝试过的内容。我确实意识到其他因素会影响速度,但购买新硬件不是一种选择。任何指导将不胜感激。

【问题讨论】:

  • 您是在处理一个大文件还是多个大文件?我们在谈论什么样的文件大小?
  • 您的数据是什么样的?特别是,'FinalScanActualDateMailDate 列是什么样的?他们是正规的吗?如果是这样,您可以通过简单地使用format 参数到pd.to_datetime 来获得很多的性能,或者如果您期望大量重复,也可以尝试记忆它。该函数使用一个日期解析器来推断您的格式,这是一项昂贵的操作。
  • @BrendenPetersen 抱歉,这是一个包含超过 3000 万条记录的巨大 3.6 gig 文件。我更新了问题。
  • 请参阅here,了解使用多处理从 CSV 读取数据块的示例。我还会考虑使用 HDF5(和 python 包 h5py)之类的东西来管理这么大的数据文件。
  • @juanpa.arrivillaga 对不起,我应该把它包括在内。我用该信息更新了问题。我愿意使用格式参数。我是菜鸟,所以我已经开始优化了。

标签: python windows pandas csv multiprocessing


【解决方案1】:

在你进入 multiprocessing 之前,我会考虑处理一些容易实现的目标(无论如何你都想做):

考虑:

In [15]: df
Out[15]:
   Class OwnerCode   Vendor       Campaign  Cycle Channel   Product  \
0      3       ECM  VendorA         000206  06-17       A  ProductB
1      3       ECM  VendorB         000106  06-17       A  ProductA
2      3       ECM      AID  ED-17-0002-06  06-17       B  ProductB
3      3       ECM      AID  ED-17-0002-06  06-17       C  ProductA

        Week      FinalActualDate State          StartDate
0    Initial  2017-06-14 02:01:00    NE  06-01-17 12:00:00
1    Initial  2017-06-14 00:15:00    NY  06-01-17 12:00:00
2  Secondary  2017-06-13 20:30:00    MA  06-08-17 12:00:00
3      Third  2017-06-15 02:13:00    NE  06-15-17 12:00:00

由于您的日期时间格式是常规的,因此只需传递 format 参数。做一个简单的测试:

In [16]: dates = df.StartDate.repeat(10000)

In [17]: len(dates)
Out[17]: 40000

In [18]: %timeit pd.to_datetime(df.StartDate)
1000 loops, best of 3: 866 µs per loop

In [19]: %timeit pd.to_datetime(df.StartDate, format="%m-%d-%y %H:%M:%S")
10000 loops, best of 3: 106 µs per loop

我的速度提高了 8 倍。除非您使用超过 8 个内核,否则这比您通过并行化所期望的要快得多。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2020-02-27
    • 2020-05-25
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多