2017-10-16 83 views
0

我很難理解如何利用/學習如何在我的Python代碼中使用多處理。我現在正在處理csv文件,這些文件在windows操作系統上有幾個演出和數千萬條記錄,並開始遇到巨大的處理速度障礙。我有以下代碼:我可以使用Python多處理來讓它在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演出。數據如下:

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沒有成功。我很失落,不值得我發佈我試過的東西。我意識到其他因素影響速度,但獲得新硬件不是一種選擇。任何指導將不勝感激。

+0

你是在一個巨型文件或許多巨型文件上運行?我們在談論什麼樣的文件大小? –

+0

你的數據是什麼樣的?特別是「FinalScanActualDate」和「MailDate」列的外觀如何?他們是否經常?如果是這樣的話,只要使用'format'參數到'pd.to_datetime',就可以獲得很多**的性能,或者如果你期望重複很多,可以嘗試記憶它。該函數使用日期分析器來推斷您的格式,這是一項昂貴的操作。 –

+0

@BrendenPetersen對不起,這是一個巨大的3.6 gig文件,超過3000萬條記錄。我更新了這個問題。 –

回答

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核以上的內核,否則這比平行化的速度要快得多。

相關問題