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

R Discussion :

Parallélisation boucle R "repeat"


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Économiste-statisticien
    Inscrit en
    Février 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Économiste-statisticien
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Parallélisation boucle R "repeat"
    Bonjour à tous,

    c'est mon premier message sur ce forum donc si je ne fais pas les choses correctement, n'hésitez pas à me le dire que je corrige !

    Alors voici mon problème : à la fin d'un de mes programmes R, j'effectue une boucle toute simple en utilisant "repeat". Cette boucle va effectuer une série de calcul pour chaque mois de l'année 137 fois, ce qui fait un total de 1 646 fois. Cela prend du temps, environ 50 minutes.

    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
     
     
    numero_profil_automatisation = read.csv2("./import_csv/numero_profil_automatisation.csv", header=TRUE, sep=";")
    n=1
    repeat {
      annee="2020"
     
      annee_profil="2020"
     
      mois_de_debut="1"
     
      mois_de_fin="12"
     
      operateur=numero_profil_automatisation[n,1]
     
      profil_choisi=numero_profil_automatisation[n,3]
      couplage=numero_profil_automatisation[n,4]
     
      subvention=numero_profil_automatisation[n,5]
     
      type=numero_profil_automatisation[n,6]
     
      seuil=0.05
     
      graine=4356
     
     
      resultat=calcul_depense(annee,annee_profil,mois_de_debut,mois_de_fin,operateur,
                              profil_choisi,couplage,subvention,type,graine,seuil)
     
     
      nom=paste("./resultat_csv/",operateur,an,type,couplage,subvention,
                profil,".csv",sep="_")
      write.csv2(resultat,nom)
     
      n<-n+1
      if (n == 138) break
    }
    Je souhaiterais optimiser le code et j'en ai donc parlé à un ami développeur calculatoire (qui ne "connait" pas R) qui m'a conseillé entre autres choses de paralléliser les calculs. Mon nouvel ordinateur de boulot possède 4 cœurs (R détecte les 8 cœurs logiques) donc je peux gagner pas mal de temps.

    Etant économiste-statisticien et non développeur, je tâtonne complétement sur le sujet. J'ai regardé quelques forums et articles et j'ai trouvé un code qui marchait sur mon précédent ordinateur qui ne possédait que 2 cœurs (R détectait les 4 cœurs logiques), cela divisait le temps de calcul par près de 2, de 2h à 1h. Sur mon nouvel ordinateur, ce bout de code ne change absolument pas le temps de calcul, avec ou sans ce bout de code cela tourne en 50 minutes (meilleur processeur plus récent, plus de ram)

    Ci-dessous les deux lignes de code que j'ai rajouté juste au-dessus du code que j'ai mis ci-dessus. Avec bien entendu les package en début de code que je peux vous donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    no_cores <- availableCores() - 1
    plan(multicore, workers = no_cores)
    Avez-vous une idée de pourquoi cela semblait fonctionner sur mon précédent ordinateur et pas sur le nouveau alors que rien n'a changé mis à part l'ordinateur ? Ou d'un correctif à apporter ?

    Merci d'avance pour votre aide,
    Victor

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Parallélisation
    Bonjour,

    Si j'ai bien compris votre programme, vous bouclez sur les lignes de votre fichier csv, ce qui est inutile, R traite toutes les lignes du dataframe en parallèle. Un extrait de votre fichier csv pourrait aider.

    Cordialement,

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Économiste-statisticien
    Inscrit en
    Février 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Économiste-statisticien
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Parallelisation
    Citation Envoyé par mgdondon Voir le message
    Bonjour,

    Si j'ai bien compris votre programme, vous bouclez sur les lignes de votre fichier csv, ce qui est inutile, R traite toutes les lignes du dataframe en parallèle. Un extrait de votre fichier csv pourrait aider.

    Cordialement,
    Bonjour,

    merci pour votre réponse.

    Effectivement, le n défini la ligne et le chiffre (en pourpre sur le code) la colonne pour extraire un mot.

    Par exemple, la ligne "profil_choisi=numero_profil_automatisation[n,3]" va prendre pour n=1 la première ligne et la troisième colonne du fichier .csv importé en début de code pour y insérer le mot "exemple1".

    Cela revient exactement au même d'écrire à la place "profil_choisi=exemple1". En fait, la boucle ne sert qu'à ne pas réécrire 137 fois ce code.

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Parallélisation
    R traite toutes les lignes du dataframe en parallèle. En supposant que les variables que vous créez correspondent aux noms de variables de votre dataframe vous obtenez :

    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
    numero_profil_automatisation = read.csv2("./import_csv/numero_profil_automatisation.csv", header=TRUE, sep=";")
     
    annee="2020"
    annee_profil="2020"
    mois_de_debut="1"
    mois_de_fin="12"
    seuil=0.05
    graine=4356
     
    numero_profil_automatisation$resultat = calcul_depense(annee, annee_profil, mois_de_debut, mois_de_fin,
                                                           numero_profil_automatisation$operateur,     # ou numero_profil_automatisation[,1]
                                                           numero_profil_automatisation$profil_choisi, # ou numero_profil_automatisation[,3]
                                                           numero_profil_automatisation$couplage,      # ou numero_profil_automatisation[,4]
                                                           numero_profil_automatisation$subvention,    # ou numero_profil_automatisation[,5]
                                                           numero_profil_automatisation$type,          # ou numero_profil_automatisation[,6]
                                                           graine, seuil)
    Par ailleurs,

    Citation Envoyé par Victor PG Voir le message
    c'est mon premier message sur ce forum donc si je ne fais pas les choses correctement, n'hésitez pas à me le dire que je corrige !
    Il est préférable de proposer un programme qui se suffit à lui-même. Vous ne fournissez ni le fichier csv ni la fonction calcul_depense, il n'est donc pas possible de tester votre programme.

    Citation Envoyé par Victor PG Voir le message
    Cette boucle va effectuer une série de calcul pour chaque mois de l'année 137 fois, ce qui fait un total de 1 646 fois.
    Peut-être que votre fonction contient une boucle sur les mois mais celle que vous présentez s'exécute 137 fois.

    Cordialement,

Discussions similaires

  1. passage d' l'index d'une boucle a une methode : banalisation de quote
    Par sallemel dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/01/2012, 12h03
  2. Performances OpenMP : parallélisation boucles
    Par ant12oine dans le forum Fortran
    Réponses: 11
    Dernier message: 03/12/2010, 13h09

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