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

Java Discussion :

[stratégie]optimisation d'un parseur


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Par défaut [stratégie]optimisation d'un parseur
    Voici déjà le code, que j'espère pas trop indigest, j'expliquerai mon problème en dessous.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
      ByteArrayOutputStream _baos = new ByteArrayOutputStream();
      HashMap _keyWords = new HashMap();
      String _filepathname ;
     
      private void generateFile() throws Exception{
        PrintWriter printwriter = new PrintWriter(_baos);
        FileReader filereader = new FileReader(_filepathname);
        StringBuffer ligne = new StringBuffer();
        StringBuffer champ = new StringBuffer();
        int dejaLu = 0;   char car = 0; String data = ""; String champmaj="";
        String champupdt="";
        TraceMgr.traceIn("avant le while");
        while (dejaLu <_file.length()){
          dejaLu = dejaLu + 1;
          car=(char)filereader.read() ;
     
          if (car == '<'){
            car=(char)filereader.read();
            if (car =='%'){
              TraceMgr.traceIn("entrée dans la balise "+dejaLu);
              car=(char)filereader.read();
              //à la fin de ce while 'champ' contient la chaine de caractère comprise
              //entre <% et %>
              while (car != '%'){
                champ.append(car);
                car=(char)filereader.read();
              }//fin while
              champmaj = champ.toString().toUpperCase();
              //chamupupdt contient la valeur à insérer à la place de <%champ%>
              champupdt = (String)_keyWords.get(champmaj);
              champ=new StringBuffer();//pourquoi pas champ="";
              ligne.append(champupdt);
              //on dépile jusqu'à lire le caractère après %>
              car=(char)filereader.read();
              car=(char)filereader.read();
              TraceMgr.traceOut("sortie dans la balise "+dejaLu);
            }//fin if (car ='%')
            else{
              ligne.append("<"+car);
            }
          }//fin if (car == '<')
     
     
          ligne.append(car);
          //en fin de ligne on recopie le buffer 'ligne' dans le printwriter
          if (car == '\n'){
            printwriter.println(ligne);
            ligne.delete(0,ligne.length());
          }
        }//fin while (dejaLu <_file.length())
     
        //si la dernière ligne n'est pas vide, on la recopie dans le printwriter
        if (ligne.length()!=0) {
          printwriter.println(ligne);
        }
        printwriter.close();
        filereader.close();
      }
    Le but de ce code est de parser un fichier .rtf d'environ 100ko, pour y relever les balises <%champ%> et les remplacer par la valeur de "champ" stockée dans une hashmap.

    Le code fonctionne, mais vu la taille du fichier, il prend à peu près 7 secondes à l'exécution.

    En faisant quelques traces, je me suis aperçu que ça n'était pas la partie du code consistant à remplacer les balises par leur valeur qui prenait du temps, mais le parcours bète et méchant de la totalité du fichier. En fait, il n'y a qu'une vingtaine de balise dans le fichier.

    Voyez-vous une amélioration algorithmique à apporter ? Ou bien peut-être d'autres classes d'entrée/sortie plus performantes que filereader et printwriter à mettre en oeuvre ?

    Je vous remercie d'avance pour votre réponse, et même simplement si vous avez eu le courage de me lire jusqu'ici !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Par défaut
    Salut,

    Est-ce que tu as essayé d'utilisé un buffer pour lire ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FileReader reader = new FileReader(file);
    BufferedReader br = new BufferedReader(reader);
    String s = br.readLine();
    while(s!=null) {
       //traitement
       s = br.readLine();
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Par défaut
    Citation Envoyé par Le prophete
    Salut,

    Est-ce que tu as essayé d'utilisé un buffer pour lire ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FileReader reader = new FileReader(file);
    BufferedReader br = new BufferedReader(reader);
    String s = br.readLine();
    while(s!=null) {
       //traitement
       s = br.readLine();
    }
    Surtout qu'après tu peux splitter ta ligne en fonction des caractères qui t'intéressent (ce qui t'évite de faire des comparaisons sur tous les caractères) et en testant la longueur du tableau obtenu, tu dois pouvoir savoir si y'a une balise ou pas.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Par défaut
    Citation Envoyé par Le prophete
    Salut,

    Est-ce que tu as essayé d'utilisé un buffer pour lire ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FileReader reader = new FileReader(file);
    BufferedReader br = new BufferedReader(reader);
    String s = br.readLine();
    while(s!=null) {
       //traitement
       s = br.readLine();
    }
    Surtout qu'après tu peux splitter ta ligne en fonction des caractères qui t'intéressent (ce qui t'évite de faire des comparaisons sur tous les caractères) et en testant la longueur du tableau obtenu, tu dois pouvoir savoir si y'a une balise ou pas.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Par défaut
    merci beaucoup, je vais voir ce que je peux faire avec ça.

    N'hésitez pas si vous avez d'autres suggestions...

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Par défaut
    Il n'y a pas de gain de temps significatif avec l'utilisation de BufferedReader. En fait, je ne peux pas exploiter les spécificités des lignes récupérées puisque je suis tenu à la généricité de mon parseur.

    D'autres idées ? De mon coté, ça fait un moment que je tourne en rond !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Par défaut
    En fait, je ne peux pas exploiter les spécificités des lignes récupérées puisque je suis tenu à la généricité de mon parseur.
    Qu'est-ce que tu entends par là ??

    En faisant un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    s = br.readLine();
    //Tu coupes ta chaîne sur chaque "<%"
    String[] splitString = s.split("<%");
    int length = splitString.length();
    for(int i = 1; i<length; i++) {
       //Tu coupes chacune de tes sous chaînes sur chaque %>. Don balise ne contient plus que les info entre balises de ta ligne de départ.
       String[] balise = splitString.split("%>");
       int length2 = balise.length;
       for(int j = 0; j<length2; j++) {
          //traitement balise[i]
       }
    }
    Ca doit marcher non ?? Ou alors y'a pe un truc que j'ai pô vu dans ton code et qui te permet pas de faire comme ça ??

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Par défaut
    merci beaucoup ! J'ai divisé mon temps de calcul par 3 ou 4 grâce à ton aide. Je ne connaissais pas la méthode split, je vois maintenant son utilité.

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

Discussions similaires

  1. [Lecture Fichier] Optimisation du parseur
    Par MrDuChnok dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 03/04/2009, 11h17
  2. Réponses: 13
    Dernier message: 19/12/2008, 14h32
  3. Réponses: 0
    Dernier message: 03/07/2008, 11h32
  4. [Stratégie]optimiser mon application java
    Par Malo dans le forum Langage
    Réponses: 3
    Dernier message: 14/02/2006, 04h45
  5. Réponses: 1
    Dernier message: 07/07/2005, 14h02

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