2017-10-16 5 views
0

J'ai du mal à comprendre comment exploiter/apprendre à utiliser le multitraitement avec mon code Python. Je suis en train de traiter des fichiers csv qui sont plusieurs concerts et des dizaines de millions d'enregistrements sur un système d'exploitation Windows et je commence à courir dans un énorme ralentissement de traitement. J'ai le code suivant:Puis-je utiliser le multitraitement Python pour que cela s'exécute plus rapidement sous 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) 

Les données sont sur le fichier qui est 3.6 concerts. Les données ressemble à:

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 

Ce code fonctionne sur les petits ensembles de données, mais il prend plusieurs heures sur le réel, grand ensemble de données. J'ai essayé plusieurs itérations de l'import concurrent.futures et du multitraitement sans succès. Je suis tellement perdu que ça ne vaut pas la peine de poster ce que j'ai essayé. Je me rends compte que d'autres facteurs ont un impact sur les vitesses, mais l'obtention d'un nouveau matériel n'est pas une option. Toute orientation serait appréciée.

+0

Opérez-vous sur un fichier géant ou de nombreux fichiers géants? Et de quelle taille de fichier parlons-nous? –

+0

À quoi ressemblent vos données? en particulier, à quoi ressemblent les colonnes «FinalScanActualDate» et «MailDate»? Sont-ils réguliers? Si c'est le cas, vous pourriez obtenir ** beaucoup ** de performance en utilisant simplement un paramètre 'format' pour' pd.to_datetime', ou peut-être essayer de le mémoriser, si vous vous attendez à beaucoup de répétitions. Cette fonction utilise un analyseur de date qui infère votre format, une opération coûteuse. –

+0

@BrendenPetersen Désolé, il s'agit d'un fichier géant de 3,6 Go avec plus de 30 millions d'enregistrements. J'ai mis à jour la question. –

Répondre

1

Avant de partir dans multiprocessing, j'envisager de traiter avec quelques fruits mûrs (que vous voulez faire indépendamment):

Considérez:

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 

Depuis votre date-heure les formats sont réguliers, il suffit de passer l'argument format. Faire un test simple:

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 

J'ai obtenu une augmentation de 8 fois la vitesse. À moins que vous ne travailliez avec des cœurs de plus de 8 cœurs, il s'agit d'une accélération beaucoup plus importante que vous ne le pensez en la parallélisant.