IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

paralléliser un programme en python


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut paralléliser un programme en python
    Bonjour,

    j'ai un problème de parallélisation d'un programme en pyhton.
    Voici mon problème:
    J'ai deux fichier f1.fa et f2.fa qui contient chacun des séquences en format FASTA.
    Je veux boucler chaque séquence de f1.fa sur toutes les séquences du f2.fa puis je vais ecrire un resultat sur un autre fichier f3.fa.
    Ici, je veux savoir est-ce que si je boucle en prallèle sur le f1.fa est-ce que je vais avoir une parallélisation?
    par exemple: c'est juste un petit code parce que je ne sais pas faire encore la parallélisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Parallel for line1 in mon_fichier1:
       for line2 in mon_fichier2:
            traitement
    ici est-ce que cette solution marche? selon vous?
    merci pour vos réponse

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par mido1951 Voir le message
    Ici, je veux savoir est-ce que si je boucle en prallèle sur le f1.fa est-ce que je vais avoir une parallélisation?
    par exemple: c'est juste un petit code parce que je ne sais pas faire encore la parallélisation
    Contrairement à d'autres langages, Python n'a pas d'instruction équivalente à un "parallel foreach" (VB, C#,.... ont cela) mais le module concurrent.futures permet de paralléliser assez simplement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    est-ce qu'ici, je peux prendre chaque séquence et tout le fichier f2.fa sur chaque thread par exemple??
    c'est à dire :
    thread1: séquence 1 de f1.fa avec toutes les séquences de f2.fa
    thread2: séquence 2 de f1.fa avec toutes les séquences de f2.fa
    thread3: séquence 3 de f1.fa avec toutes les séquences de f2.fa
    thread4: séquence 4 de f1.fa avec toutes les séquences de f2.fa
    thread5: séquence 5 de f1.fa avec toutes les séquences de f2.fa
    puis:
    thread1: séquence 6 de f1.fa avec toutes les séquences de f2.fa
    thread2: séquence 7 de f1.fa avec toutes les séquences de f2.fa
    thread3: séquence 8 de f1.fa avec toutes les séquences de f2.fa
    thread4: séquence 9 de f1.fa avec toutes les séquences de f2.fa
    thread5: séquence 10 de f1.fa avec toutes les séquences de f2.fa
    ....
    est-ce que je peux faire ça?
    c'est ce que je veux faire afin de ne pas prendre tout en séquentiel.
    Merci pour vos réponse.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par mido1951 Voir le message
    est-ce que je peux faire ça?
    c'est ce que je veux faire afin de ne pas prendre tout en séquentiel.
    Comme c'est vous qui codez, vous avez une certaine liberté (tant que çà respecte les lois de la physique...)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour info, il y a eu une discussion sur ce type de sujet il y a peu:

    http://www.developpez.net/forums/d15...sing-qprocess/
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    merci pour votre aide.
    Je vais voir l'autre discussion et je vais essayer de comprendre un peu. Mon problème c'est que j'ai jamais utilisé le parallélisme en pyhton ou dans un autre programme.
    juste une question:
    si thread1,thread2,thread3,thread4,thread5 ont accès en meme temps au f2.fa en mode lecture c'est à dire qu'ils partagent la meme ressource. Est-ce qu'il y a un problème lors de la lecture ici?ou ça ne pose pas de problème?
    Merci

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    voici mon programme que je veux paralléliser.
    c'est programme qui compare des séquences trés longues en essayant d'extraire des sous-chaines de taille k.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import os
    import sys
     
    k=15
     
    mon_fichier1=open(sys.argv[1],"r")
     
    for line1 in mon_fichier1:
        mon_fichier2=open(sys.argv[2],"r")
        if line1[0]=='>':
             seq1id=line1[:-2]
        else:
            for line2 in mon_fichier2:
                if line2[0]=='>':
                    seq2id=line2[:-2]
                else:
                    print ("seq1id :",seq1id)
                    print ("seq2id :",seq2id)
                    if seq1[0]!='>' and seq2[0]!='>':
                        L1=[]
                        L2=[]
                        for i in range(0, len(seq1)-k+1,k):
                            item=seq1[i:i+k]
                            if item not in L1:
                                L1.append(item)
                        for i in range(0, len(seq2)-k+1):
                            item=seq2[i:i+k]
                            if item not in L2:
                                L2.append(item)
                        C=0
                        for kmer1 in L1:
                            for kmer2 in L2:
                                if kmer1==kmer2:
                                    C=C+1
                        print ("C= ",C)
                        if C>5:
                            print("il y a une ressemblence!!") #je vais ajouter d'autres traitement
     
     
    mon_fichier1.close()
    mon_fichier2.close()
    ce que je faire ici c'est prendre chaque séquence de la première boucle c'est à dire je veux paralléliser la première boucle for.
    est-ce que vous pouez m'aider comment faire dans ce cas?
    MERCI

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    voici mon programme que je veux paralléliser.
    c'est programme qui compare des séquences trés longues en essayant d'extraire des sous-chaines de taille k.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import os
    import sys
     
    k=15
     
    mon_fichier1=open(sys.argv[1],"r")
     
    for line1 in mon_fichier1:
        mon_fichier2=open(sys.argv[2],"r")
        if line1[0]=='>':
             seq1id=line1[:-2]
        else:
            for line2 in mon_fichier2:
                if line2[0]=='>':
                    seq2id=line2[:-2]
                else:
                    print ("seq1id :",seq1id)
                    print ("seq2id :",seq2id)
                    if seq1[0]!='>' and seq2[0]!='>':
                        L1=[]
                        L2=[]
                        for i in range(0, len(seq1)-k+1,k):
                            item=seq1[i:i+k]
                            if item not in L1:
                                L1.append(item)
                        for i in range(0, len(seq2)-k+1):
                            item=seq2[i:i+k]
                            if item not in L2:
                                L2.append(item)
                        C=0
                        for kmer1 in L1:
                            for kmer2 in L2:
                                if kmer1==kmer2:
                                    C=C+1
                        print ("C= ",C)
                        if C>5:
                            print("il y a une ressemblence!!") #je vais ajouter d'autres traitement
     
     
    mon_fichier1.close()
    mon_fichier2.close()
    ce que je faire ici c'est prendre chaque séquence de la première boucle c'est à dire je veux paralléliser la première boucle for.
    est-ce que vous pouez m'aider comment faire dans ce cas?
    MERCI
    Avant d'essayer de paralléliser, il faudrait déjà que votre programme fonctionne!
    Vu qu'à la ligne 19, vous accédez à des variables seq1 et seq2 qui n'ont jamais été assignées: c'est pas gagné.

    Pour commencer, çà serait bien de réduire fichier1 et fichier2 à des jeux de données significatives qui vont vous permettre de tester sans avoir à attendre des plombes.

    Lorsque votre programme sera tombé en marche, il sera temps d'essayer d'optimiser.
    Cela fait, il sera enfin temps de voir si paralléliser apportera quelque chose.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    oui, j'ai effacé seq1 et seq2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import os
    import sys
     
    k=15
     
    mon_fichier1=open(sys.argv[1],"r")
     
    for line1 in mon_fichier1:
        mon_fichier2=open(sys.argv[2],"r")
        if line1[0]=='>':
             seq1id=line1[:-2]
        else:
            seq1=line1
            for line2 in mon_fichier2:
                if line2[0]=='>':
                    seq2id=line2[:-2]
                else:
                    seq2=line2
                    print ("seq1id :",seq1id)
                    print ("seq2id :",seq2id)
                    if seq1[0]!='>' and seq2[0]!='>':
                        L1=[]
                        L2=[]
                        for i in range(0, len(seq1)-k+1,k):
                            item=seq1[i:i+k]
                            if item not in L1:
                                L1.append(item)
                        for i in range(0, len(seq2)-k+1):
                            item=seq2[i:i+k]
                            if item not in L2:
                                L2.append(item)
                        C=0
                        for kmer1 in L1:
                            for kmer2 in L2:
                                if kmer1==kmer2:
                                    C=C+1
                        print ("C= ",C)
                        if C>5:
                            print("il y a une ressemblence!!") #je vais ajouter d'autres traitement
     
     
    mon_fichier1.close()
    mon_fichier2.close()
    oui, j'ai essayé de travailler sur des jeux de données très réduit et ça marche très bien. Mais avec des fichiers très gros en taille. il prend bcp de temps en exécution peut la parallélisation est la solution.
    vous en penez quoi?
    MErci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    vous en pensez quoi?
    ligne21 vous savez déjà que vos ligne ne commencent pas par '>'.
    ligne24 vous faites un traitement sur la ligne du premier fichier qui se répétera autant de fois qu'il y a de lignes dans le 2ème fichier qui...
    C'est sûr qu'en programmant comme çà, il faut plein de CPUs.

    Si quelqu'un veut prendre le temps de comprendre ce que vous essayez de faire pour vous proposer quelque chose de plus performant... pourquoi pas? Il faut peut être aussi regarder les idées que pourraient avoir ceux qui traînent dans le forum algo.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    merci pout vos conseils.
    Est-ce que vous pouvez au moins m'aider sur une programmation parallèle de programme?
    mon problème est que j'ai pas pu paralléliser ça!
    est-ce que vous avez le temps pour m'aider sur le code de parallélisation? Je ne sais pas meme pas par ou commencer!!
    merci

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par mido1951 Voir le message
    Je ne sais pas même pas par ou commencer!!
    Juste un coup de pouce.

    Il faudrait commencer par comprendre comment se passe ce genre de solution avec Python: as-tu essayé un exemple simple avec concurrent.future?

    Si oui, tu as compris que pour utiliser tous les CPU, il faut déjà séparer ton problème en morceaux indépendants.

    Par exemple, pour utiliser "map", il faut d'abord créer une fonction dont l'exécution ne dépendra pas des autres exécutions.

    Si ton problème c'est: je prends chaque ligne du 1er fichier et je cherche dans toutes les lignes du 2ème fichier des séquences communes de 15 caractères, les arguments de ton fichier sont: une ligne du 1er fichier et la liste de toutes les lignes du 2ème fichier. Il te suffira de boucler sur toutes les lignes du 1er fichier pour avoir tous tes résultats en utilisant pour ça tous tes CPU.

    Il faudra voir, bien sûr, si la taille du 2ème fichier permet de l'avoir entièrement en mémoire. Mais si ce n'était pas le cas, il est possible que le temps total de calcul dépende plus du temps de lecture du disque que de l'utilisation des CPU, ce qui rendrait ta tentative inutile pour gagner du temps.

    Ne cherche pas à coder au hasard: on ne sait pas coder quelque chose qu'on ne comprend pas!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    merci pout vos conseils.
    Est-ce que vous pouvez au moins m'aider sur une programmation parallèle de programme?
    mon problème est que j'ai pas pu paralléliser ça!
    est-ce que vous avez le temps pour m'aider sur le code de parallélisation? Je ne sais pas meme pas par ou commencer!!
    Il faut commencer par lire la documentation de concurrent.futures qui contient des exemples de cas d'utilisation de base (que je vous avais déjà indiqué).

    Pour le reste, la biologie moléculaire n'est pas un sujet "nouveau", vous avez des bibliothèques regroupées sous le générique BioPython qui disposent déjà de fonctionnalités à regarder avant de vouloir de faire mieux.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Meilleur livre pour apprendre à programmer en Python
    Par Guigui_ dans le forum Général Python
    Réponses: 56
    Dernier message: 13/02/2016, 01h31
  2. probleme en faisant un programme en python
    Par tozier_4 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/04/2008, 13h54
  3. programmer en python sous windows avec emacs
    Par Mydriaze dans le forum Général Python
    Réponses: 5
    Dernier message: 24/09/2007, 23h01
  4. exécuter des programmes avec python
    Par piotrgavriloff dans le forum Général Python
    Réponses: 1
    Dernier message: 24/06/2007, 02h09
  5. Lire un programme en python, sans python
    Par Guigiz dans le forum Py2exe
    Réponses: 15
    Dernier message: 09/06/2006, 22h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo