【发布时间】: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 的迭代,但都没有成功。我很迷茫,不值得我发布我尝试过的内容。我确实意识到其他因素会影响速度,但购买新硬件不是一种选择。任何指导将不胜感激。
【问题讨论】:
-
您是在处理一个大文件还是多个大文件?我们在谈论什么样的文件大小?
-
您的数据是什么样的?特别是,
'FinalScanActualDate和MailDate列是什么样的?他们是正规的吗?如果是这样,您可以通过简单地使用format参数到pd.to_datetime来获得很多的性能,或者如果您期望大量重复,也可以尝试记忆它。该函数使用一个日期解析器来推断您的格式,这是一项昂贵的操作。 -
@BrendenPetersen 抱歉,这是一个包含超过 3000 万条记录的巨大 3.6 gig 文件。我更新了问题。
-
请参阅here,了解使用多处理从 CSV 读取数据块的示例。我还会考虑使用 HDF5(和 python 包 h5py)之类的东西来管理这么大的数据文件。
-
@juanpa.arrivillaga 对不起,我应该把它包括在内。我用该信息更新了问题。我愿意使用格式参数。我是菜鸟,所以我已经开始优化了。
标签: python windows pandas csv multiprocessing