2017-10-16 1 views
0

파이썬 코드를 사용하여 멀티 프로세싱을 활용하는 방법을 이해하는 데 어려움을 겪고 있습니다. 지금은 Windows OS에서 몇 기가 바이트 및 수백만 개의 레코드 인 csv 파일을 처리하고 있으며 엄청난 처리 속도가 느려지 기 시작했습니다. 나는 다음 코드를 가지고있다 :파이썬 다중 처리를 사용하여 창에서 더 빨리 실행할 수 있습니까?

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와 멀티 프로세싱의 여러 반복을 성공으로 시도했다. 나는 잃어버린 것이므로 내가 시도한 것을 게시 할 가치가 없다. 나는 다른 요소들이 속도에 영향을 미치지 만 새로운 하드웨어를 얻는 것이 선택 사항이 아니라는 것을 알고 있습니다. 모든 지침을 부탁드립니다.

+0

하나의 거대한 파일 또는 여러 거대한 파일로 작업하고 있습니까? 그리고 어떤 종류의 파일 크기를 말하는 겁니까? –

+0

데이터는 어떻게 생겼습니까? 특히''FinalScanActualDate'와'MailDate' 컬럼은 어떻게 생겼을까요? 규칙적인가? 그렇다면 간단히'pd.to_datetime'에'format' 매개 변수를 사용하여 ** 많은 성능을 얻을 수 있습니다. 또는 반복을 많이 기대한다면 아마도 그것을 메모 해보십시오. 이 함수는 형식을 유추하는 날짜 파서를 사용하므로 값 비싼 작업입니다. –

+0

@BrendenPetersen 죄송합니다. 3,000 만 건이 넘는 거대한 3.6GB 파일입니다. 나는 그 질문을 갱신했다. –

답변

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 코어가 넘는 코어로 작업하지 않는 한, 병렬화를 통해 기대하는 것보다 훨씬 더 빠른 속도입니다.

관련 문제