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

JavaScript Discussion :

Temps d'exécution tableau long


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Par défaut Temps d'exécution tableau long
    Bonjour à tous!

    Je sollicite votre aide pour un problème de programmation. Je suis débutant et j'apprends à utiliser Javascript pour essentiellement l'utiliser sur Google Script afin de manipuler Google Sheet.

    J'ai écrit quelques lignes pour réaliser une action simple : mettre une valeur dans une colonne B du tableur en fonction de la valeur d'une colonne A de ce même tableur. Donc tout simplement j'ai utilisé if. Le soucis est que j'ai à peu près 20000 lignes et même en utilisant un tableau pou ranger les valeurs, ça prends un temps interminable (ou ça me mets un truc comme Running Out)..

    Voici mon code (google script):

    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
     
    // Permet d'obtenir le nombre de ligne de ma feuille
     
    function DerniereLigne() {
     
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Liste');
      var lignes = sheet.getLastRow();
      return lignes
    }
     
    // Permet d'affecter une valeur colonne B en fonction colonne A
    function Tri() {
     
      var tab1 = []
      var tab2 = []
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.setActiveSheet(ss.getSheetByName('Liste'));
     
      for (var i =0,c=DerniereLigne()-1 ; i < c;i++){
        tab1.push(sheet.getRange("A"+ (i+2)).getValues());
        }
     
      for (var k =0;k<c;k++){
        if (tab1[k]=="Pomme") {
          tab2[k]="Fruit"
       } else if (tab1[k]=="Carotte") {
          tab2[k]="Légume"
        } else {
          tab2[k]="Rien"
        }
      }
     
      for (var j =0 ; j < c;j++){
         sheet.getRange("B"+ (j+2)).setValue(tab2[j]);
         }
    }
    Mon code marche très bien pour moins de 100 lignes. Si je commence a mettre 2000 ligne ça prends une bonne minutes mais pour 20000 ça a jamais réussi.. Avez vous une idée pour optimiser ce code ?

    Je vous remercie d'avance !
    A bientot

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    À brûle-pourpoint, je dirais que tes deux tableaux ne sont pas utiles, et qu'il serait plus simple de faire une seule boucle au lieu de trois qui renseignerait la colonne B directement pour chaque valeur de la colonne A.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Par défaut
    En suivant tes conseils j'ai fais ça :

    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
     
    // Permet d'obtenir le nombre de ligne de ma feuille
     
    function DerniereLigne() {
     
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Liste');
      var lignes = sheet.getLastRow();
      return lignes
    }
     
    // Permet d'affecter une valeur colonne B en fonction colonne A
    function Tri() {
     
    // Initialisation du timer
      var startTime = new Date().getTime();
      var elapsedTime = 0;
     
      var tab1 = [];
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.setActiveSheet(ss.getSheetByName('Liste'));
     
      for (var i =0,c=DerniereLigne()-1 ; i < c;i++){
        tab1.push(sheet.getRange("A"+ (i+2)).getValues());
         if (tab1[i]=="Pomme") {
          tab1[i]="Fruit"
        } else if (tab1[i]=="Carotte") {
          tab1[i]="Légume"
        } else {
          tab1[i]="Rien"
        }
        sheet.getRange("B"+ (i+2)).setValue(tab1[i]);
        }
     
      elapsedTime = new Date().getTime() - startTime;
      SpreadsheetApp.getUi().alert((elapsedTime/ 1000));
    }
    Sur le code que j'avais fais avant, pour une base de 2000 lignes ça prenant environs 130 secondes.

    Là, avec ce code là, après 5 minutes c'était toujours en cours, et au bout de la moitié ca s'est arrété car c'était trop long (Durée d'exécution dépassé)
    Avec ce code, ça affiche les cellules 1 par 1, donc on perds l'utilité de faire des tableaux, non ?

    Après analyse, l'étape critique est celle où les cellules initiaux sont renseignés dans le tableau (tab1), avez vous une solution pour rentrer plus rapidement tous les valeurs dans une tableau ?

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Salut

    Je suis encor apprenti dans le langage JavaScript, que donnerait
    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
    function Tri() {
     
    // Initialisation du timer
      var startTime = new Date().getTime();
      var elapsedTime = 0;
     
      //var tab1 = [];
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.setActiveSheet(ss.getSheetByName('Liste'));
     
      //for (var i =0,c=DerniereLigne()-1 ; i < c;i++){
      var RetValue ;
      var c=DerniereLigne()+1;
      var i = 2;
      for (; i < c;i++){
        //tab1.push(sheet.getRange("A"+ (i+2)).getValues());
        switch (sheet.getRange("A"+ (i)).getValues())
            {
                case "Pomme":
    		RetValue = "Fruit";
    		break;		
                case "Carotte":
    		RetValue = "Légume";
    		break;		
                default:
    		RetValue = "Rien";
    	}
    	// if (tab1[i]=="Pomme") {
        //  tab1[i]="Fruit"
        //} else if (tab1[i]=="Carotte") {
        //  tab1[i]="Légume"
        //} else {
        //  tab1[i]="Rien"
        // }
        //sheet.getRange("B"+ (i+2)).setValue(tab1[i]);
        sheet.getRange("B"+ (i)).setValue(RetValue);
        }
     
      elapsedTime = new Date().getTime() - startTime;
      SpreadsheetApp.getUi().alert((elapsedTime/ 1000));
    }
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Par défaut
    Salut,

    J'ai essayé ton code mais ça traite cellule par cellule et ça affiche les résultats au fur et a mesure dans la colonne B. Donc le temps d'exécution est très long, c'est pour cette raison que j'ai utilisé des tableau pour stocker les données.

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Citation Envoyé par Jonhy7 Voir le message
    Salut,
    .... et ça affiche les résultats au fur et a mesure dans la colonne B.
    J'ai repris ton code post N° 3, qui lui aussi affiche au fur et à mesurei.

    Dans un autre langage de programmation, pour largement améliorer la vitesse, je cachais/rendais invisible le grid durant les modifications de son contenu et le remettais visible après son actualisation, c'est peut-être une piste ...
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TCPDF] Temps d'exécution trop long
    Par -Neo- dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 06/11/2009, 12h08
  2. Pourquoi le temps d'exécution si long sur PDI ?
    Par helene0618 dans le forum kettle/PDI
    Réponses: 7
    Dernier message: 11/03/2009, 21h49
  3. Temps d'exécution très long : jointure
    Par ddazou dans le forum SQL
    Réponses: 18
    Dernier message: 28/10/2008, 21h59
  4. temps d'exécution trop long trés bizarre
    Par fatjoe dans le forum C++
    Réponses: 0
    Dernier message: 09/05/2008, 02h42
  5. temps d'exécution très long
    Par Adam_01 dans le forum C#
    Réponses: 18
    Dernier message: 22/06/2007, 09h37

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