2016-06-02 1 views
0

J'ai un script python qui a un temps d'exécution élevé (4 jours lors du test d'un seul script sur une seule machine virtuelle) qui fonctionne sur une liste de fichiers basée sur ses arguments d'entrée nous fournissons.Plusieurs scripts Python sur une machine multicœur unique

La liste d'arguments que je voulais tester est très longue et l'exécution séquentielle de chacun d'entre eux n'est pas réalisable en raison du coût élevé de l'infrastructure.

J'ai donc essayé d'exécuter le script indépendamment avec différents arguments sur ma machine à 12 cœurs, par ex.

nohup python script.py 1 & 
nohup python script.py 2 & 

et les 8 autres fois .. pensant que chaque processus sera attribué à chaque noyau de façon indépendante et 2 noyau sera en veille, car il n'y a pas de chevauchement dans les fichiers sur lesquels les scripts travailleraient, toute Une condition de concurrence ou une impasse ne se produirait pas car l'argument que nous passons à tous les scripts est différent, donc pas de problème avec GIL. Ce que j'ai observé est que les scripts python individuels ne fonctionnent pas au même rythme ou suivant la chronologie précédemment notée, tous les dix processus distincts devraient terminer dans les 4 jours mais cela a été comme 14 jours mais seulement quelques threads ont terminé et cela aussi en seulement 1-2 jours. Les autres processus sont en retard, ce que je pouvais voir à partir du fichier journal généré.

Quelqu'un peut m'aider s'il vous plaît à comprendre ce comportement pour python ??

+0

" tous les dix processus distincts devraient se terminer dans les 4 jours "Etes-vous sûr de cela? Les avez-vous dirigés séparément? Est-ce qu'ils dépendent d'une ressource commune qui peut limiter la vitesse de traitement? –

+0

Oui, je connais la liste des fichiers dont ils dépendent, et tous sont distincts. Il n'y a pas de fichier/ressource commun entre eux. – lorenzofeliz

+2

Le processeur est le goulot d'étranglement seulement dans un programme mal écrit, ou lorsque vous avez des calculs lourds (modèles météorologiques ou océanographiques). Si le lancement de plusieurs processus sur une machine multicœur n'augmente pas beaucoup la vitesse, vous devriez vous demander si votre traitement pourrait être E/S ou lié à la mémoire au lieu du processeur –

Répondre

0

Je suggère d'abord essayer de décrire et de comprendre plus sur votre programme et ses performances:

Vous pouvez commencer par la ligne Python profileur, il est utilisé pour voir à quelle vitesse et à quelle fréquence chaque ligne de code est en cours d'exécution en votre script.

pip install line_profiler 

Une fois que vous le temps, vous pouvez commencer à analyser la mémoire

pip install -U memory_profiler 
pip install psutil 

La meilleure façon de trouver des « fuites de mémoire » est d'utiliser un outil génial appelé objgraph Cet outil vous permet de voir le nombre de objets dans la mémoire et également localiser tous les différents endroits dans votre code qui contiennent des références à ces objets. Une fois que vous avez compris chaque partie du script, pouvez-vous décrire plus en détail la nature de votre code? Lisez également cet extrait d'un post précédent:

"" Pour tirer parti d'un ordinateur multicœur (ou multiprocesseur), vous avez besoin d'un programme écrit de telle sorte qu'il puisse être exécuté en parallèle et d'un environnement d'exécution. Cela permettra au programme d'être exécuté en parallèle sur plusieurs cœurs (et le système d'exploitation, bien que tout système d'exploitation que vous pouvez exécuter sur votre PC le fera) .Ceci est vraiment une programmation parallèle, bien qu'il existe différentes approches de programmation parallèle. celles qui sont pertinentes pour Python sont multitraitement et multithreading. "

Does python support multiprocessor/multicore programming?