2017-01-16 1 views
1

J'ai plusieurs fichiers de données que je traite en utilisant des bibliothèques Python Python. Chaque fichier est traité un par un, et un seul processeur logique est utilisé lorsque je regarde Gestionnaire de tâches (il est à ~ 95%, et le reste à 5%)Traitement simultané de plusieurs fichiers de données à l'aide de plusieurs cœurs

Y at-il un moyen de traiter les fichiers de données simultanément ? Si oui, y a-t-il un moyen d'utiliser les autres processeurs logiques pour faire cela?

(Edits sont les bienvenus)

+0

[Réflexion sur la vidéo Concurrency] (https://www.youtube.com/watch?v=Bv25Dwe84g0) – wwii

+1

Jetez un coup d'œil à [multipro cessing.pool] (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool) – swenzel

+0

@swenzel m'a battu. allait saisir la chose exacte –

Répondre

0

Vous pouvez traiter les différents fichiers dans différents threads ou dans des processus différents.

La bonne chose de python est que son cadre fournit des outils pour vous permettre de le faire:

from multiprocessing import Process 

def process_panda(filename): 
    # this function will be started in a different process 
    process_panda_import() 
    write_results() 

if __name__ == '__main__': 
    p1 = Process(target=process_panda, args=('file1',)) 
    # start process 1 
    p1.start() 
    p2 = Process(target=process_panda, args=('file2',)) 
    # starts process 2 
    p2.start() 
    # waits if process 2 is finished 
    p2.join() 
    # waits if process 1 is finished 
    p1.join() 

Le programme commencera 2 enfants-processus, qui peuvent être utilisés ne traiter vos fichiers. De court, vous pouvez faire quelque chose de similaire avec des discussions.

Vous trouverez la documentation ici: https://docs.python.org/2/library/multiprocessing.html

et ici:

https://pymotw.com/2/threading/

+2

Remarque rapide: il semble que les threads Python n'utiliseront pas plusieurs cœurs, selon: http://stackoverflow.com/questions/7542957/is-python-capable-of-running-on- plusieurs cœurs. La bibliothèque 'multiprocessing' l'utilisera, cependant. – phss

+0

Bonne information, merci de le partager! – KimKulling

+1

@KimKulling, Réservissez-vous pour le code et les liens supplémentaires :) –

0

Si vos noms de fichiers sont dans une liste, vous pouvez utiliser ce code:

from multiprocessing import Process 

def YourCode(filename, otherdata): 
    # Do your stuff 

if __name__ == '__main__': 
    #Post process files in parallel 
    ListOfFilenames = ['file1','file2', ..., 'file1000'] 
    ListOfProcesses = [] 
    Processors = 20 # n of processors you want to use 
    #Divide the list of files in 'n of processors' Parts 
    Parts = [ListOfFilenames[i:i + Processors] for i in xrange(0, len(ListOfFilenames), Processors)] 

    for part in Parts: 
     for f in part: 
      p = multiprocessing.Process(target=YourCode, args=(f, otherdata)) 
      p.start() 
      ListOfProcesses.append(p) 
     for p in ListOfProcesses: 
      p.join() 
+2

Jetez un coup d'œil à 'concurrent.futures.ProcessPoolExecutor' - la même idée, mais avec prudence, et avec des cas de coin, et autres - https: // docs .python.org/3/library/concurrent.futures.html – jsbueno

+0

Merci! Mais, malheureusement, il ne semble pas être disponible pour Python 2.7 ... – Diego

+0

Python 2.7 a sept ans maintenant - et il était déjà un peu vieux quand il a été publié, car Python 3 était déjà là. l'OP ne mentionne pas qu'il utilise Python2. (bien sûr, une réponse suggérant que concurrent.futures devrait mentionner que c'est Python 3 seulement) – jsbueno