2017-10-16 4 views
0

Pythonコードでマルチプロセッシングを使用する方法を理解するのは難しいです。私は今、Windows OS上でいくつかのギグと数千万のレコードであるcsvファイルを処理しており、大量の処理速度のバンプに陥り始めています。私は次のコードを持っています: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 

このコードは小さなデータセットで動作しますが、実際の大きなデータセットでは数時間かかることがあります。私は、import concurrent.futuresとmultiprocessingのいくつかの反復を成功裏に試みました。私は失われているので、私が試したことを投稿する価値はありません。私は他の要因が速度に影響するが、新しいハードウェアを入手することは選択肢ではないことを認識している。どんな指導も高く評価されます。

+0

1つの巨大なファイルまたは多数の巨大なファイルで操作していますか?そして、どんな種類のファイルサイズですか? –

+0

あなたのデータはどのように見えますか?特に、 '' FinalScanActualDate'と 'MailDate'の列はどうなっていますか?彼らは定期的ですか?もしそうなら、 'pd.to_datetime'に' format'パラメータを使うだけで**たくさんのパフォーマンスを得ることができます。あるいは、繰り返したくさんの場合はメモをつけてみてください。この関数は、あなたの書式を推測する日付パーサーを使用します。これはコストのかかる操作です。 –

+0

@BrendenPetersen申し訳ありません、それは3000万レコード以上の1つの巨大な3.6ギグファイルです。私は質問を更新しました。 –

答えて

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以上のコアで作業している場合を除いて、これは並列化した場合よりもはるかに高速です。

関連する問題