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

Documents Java Discussion :

Gestion importante de String


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Par défaut Gestion importante de String
    Bonjour à tous

    Dans le cadre d'une application je dois effectuer des tests sur un fichier csv ayant pour séparateur ";"

    Je créer donc un FILE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     File fileTraitement = new File(path);
    et les outils associés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FileReader fr = new FileReader(fileTraitement);
                        BufferedReader br = new BufferedReader(fr);
    ensuite je boucle dans une while tant qu'il reste des lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
       while ((ligne = br.readLine()) != null) {
     
    }
    Puis je créer un StringTokenizer de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        st = new StringTokenizer(ligne);
    Dans la boucle dans un premier temps je procédais ainsi :

    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
     
          st = new StringTokenizer(ligne);
                            String sampleT = st.nextToken(";");
                            String locusT = st.nextToken(";");
                            String runT = st.nextToken(";");
                            String dyeT = st.nextToken(";");
                            String alleleT1 = st.nextToken(";");
                            String peakT1 = st.nextToken(";");
                            String qualT1 = st.nextToken(";");
                            String volumeT1 = st.nextToken(";");
                            String alleleT2 = st.nextToken(";");
                            String peakT2 = st.nextToken(";");
                            String qualT2 = st.nextToken(";");
                            String volumeT2 = st.nextToken(";");
                            String commentT = st.nextToken(";");
    Puis j'ai vu qu'il y avait des optimisations possibles avec StringBuilder :
    Donc en dehors de ma boucle je créer mes StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          StringBuilder sampleT = new StringBuilder();
                            StringBuilder locusT = new StringBuilder();
                            StringBuilder runT = new StringBuilder();
                            StringBuilder dyeT = new StringBuilder();
                            StringBuilder alleleT1 = new StringBuilder();
                            StringBuilder peakT1 = new StringBuilder();
                            StringBuilder qualT1 = new StringBuilder();
                            StringBuilder volumeT1 = new StringBuilder();
                            StringBuilder alleleT2 = new StringBuilder();
                            StringBuilder peakT2 = new StringBuilder();
                            StringBuilder qualT2 = new StringBuilder();
                            StringBuilder volumeT2 = new StringBuilder();
                            StringBuilder commentT = new StringBuilder();
    Et dans la boucle :

    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
     
     
                                sampleT.insert(0, st.nextToken(";"));
                                locusT.insert(0, st.nextToken(";"));
                                runT.insert(0, st.nextToken(";"));
                                dyeT.insert(0, st.nextToken(";"));
                                alleleT1.insert(0, st.nextToken(";"));
                                peakT1.insert(0, st.nextToken(";"));
                                qualT1.insert(0, st.nextToken(";"));
                                volumeT1.insert(0, st.nextToken(";"));
                                alleleT2.insert(0, st.nextToken(";"));
                                peakT2.insert(0, st.nextToken(";"));
                                qualT2.insert(0, st.nextToken(";"));
                                volumeT2.insert(0, st.nextToken(";"));
                                commentT.insert(0, st.nextToken(";"));
    Je vide et je rempli à chaque fois les champs et ce pour un fichier qui peut contenir 100000 lignes

    Pensez vous que c'est une méthode correct maintenant en utilisant les StringBuilder ou c'est encore la catastrophe et si c'est le cas quels outils devrais-je utiliser

    J'espère avoir des réponses
    Merci
    Ben

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    les stringbuilder ne sont utile que pour construire une string morceaux par morceaux, afin de remplacer plein d'appels successifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maString = maString+ "un morceau en plus";
    Dans ton cas, leur utilisation est non seulement inutile, mais elle ralenti le programme (tu prend un string, tu la met dans un stringbuilder puis tu transforme vraissemblablement le stringbuilder en string -> perte de temps, t'avais la bonne string dès le départ.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Par défaut
    Merci pour ta réponse
    Avec se mécanisme je gagne quand même un peu de temps mais pas grand chose le soucis est Qu'avec les String j'utilise beaucoup de mémoire du fait qu'à chaque changement de la String une nouvelle instance String est créée alors qu'avec les StringBuilder c'est un remplacement.

    Mais j'ai toujours pas trouvé le moyen d'aller plus vite.
    Je ne sais pas ce que valent les StringTokenizer pour le découpage d'une ligne avec séparateur ";" . Je sais qu'il existe aussi la méthode split pour les String qui permet de contourner les token mais bon je pense pas qu'il y est un gain important.

    Merci

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ton code, clairement, ne montre pas de modification de string et donc aucun intérêt à passer par les stringbuilder. Si tu nous montrait un peu plus de ce que tu fait de tes stringbuilder, on pourrait peut etre t'aider.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 129
    Par défaut
    et voila
    Je ne l'ai pas mise car je pense pas que se soit compréhensible sans toutes les sources mais bon j'espère que ti verra un peu plus clair
    Et si tu ti connais en EJB dit moi ce que tu en penses par la meme occaz merci

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
     
     
       public String doImport() {
     
            long begin = System.currentTimeMillis();
     
            if (verifImport == true) {
     
     
     
                // ouvre le fichier d'import
                File fileTraitement = new File(File.separator + repository + "outImportSample" + sessionId + ".csv");
                List<AllResSample> listeAllResSample = new ArrayList<AllResSample>();
     
                if (fileTraitement.isFile()) {
                    StringTokenizer st;
     
                    try {
                        FileReader fr = new FileReader(fileTraitement);
                        BufferedReader br = new BufferedReader(fr);
     
                        String ligne;
     
                        try {
     
                            AllResSample all1;
                            AllResSample all2;
                            AllResSamplePk pk1;
                            AllResSamplePk pk2;
     
     
                            StringBuilder sampleT = new StringBuilder();
                            StringBuilder locusT = new StringBuilder();
                            StringBuilder runT = new StringBuilder();
                            StringBuilder dyeT = new StringBuilder();
                            StringBuilder alleleT1 = new StringBuilder();
                            StringBuilder peakT1 = new StringBuilder();
                            StringBuilder qualT1 = new StringBuilder();
                            StringBuilder volumeT1 = new StringBuilder();
                            StringBuilder alleleT2 = new StringBuilder();
                            StringBuilder peakT2 = new StringBuilder();
                            StringBuilder qualT2 = new StringBuilder();
                            StringBuilder volumeT2 = new StringBuilder();
                            StringBuilder commentT = new StringBuilder();
                            int t = 0;
     
                            while ((ligne = br.readLine()) != null) {
                                alleleAmount = 1;
     
                                //  System.out.println(ligne);
                            /*set les attributs temporaire*/
     
                                st = new StringTokenizer(ligne);
     
                                sampleT.insert(0, st.nextToken(";"));
                                locusT.insert(0, st.nextToken(";"));
                                runT.insert(0, st.nextToken(";"));
                                dyeT.insert(0, st.nextToken(";"));
                                alleleT1.insert(0, st.nextToken(";"));
                                peakT1.insert(0, st.nextToken(";"));
                                qualT1.insert(0, st.nextToken(";"));
                                volumeT1.insert(0, st.nextToken(";"));
                                alleleT2.insert(0, st.nextToken(";"));
                                peakT2.insert(0, st.nextToken(";"));
                                qualT2.insert(0, st.nextToken(";"));
                                volumeT2.insert(0, st.nextToken(";"));
                                commentT.insert(0, st.nextToken(";"));
     
                                all1 = new AllResSample();
                                all2 = new AllResSample();
                                pk1 = new AllResSamplePk();
                                pk2 = new AllResSamplePk();
     
                                pk1.setLocusId(locusT.substring(0));
                                pk1.setProjetId(projetId);
                                pk1.setSampleId(sampleT.substring(0));
     
     
                                /*pour une ligne qui possède la meme allele*/
                                if (alleleT1.equals(alleleT2)) {
                                    pk1.setAlleleId(alleleT1.substring(0));
                                    all1.setClePrimaire(pk1);
                                    all1.setAlleleAmount(alleleAmount);
                                    all1.setComment(commentT.substring(0));
                                    all1.setDiscard(false);
                                    all1.setDye(dyeT.substring(0));
                                    all1.setPeak(Double.valueOf(peakT1.substring(0)));
                                    all1.setQuality(Integer.parseInt(qualT1.substring(0)));
                                    all1.setRun(runT.substring(0));
                                    all1.setVolume(Integer.parseInt(volumeT1.substring(0)));
                                    listeAllResSample.add(all1);
                                } else {
     
                                    pk2.setLocusId(locusT.substring(0));
                                    pk2.setProjetId(projetId);
                                    pk2.setSampleId(sampleT.substring(0));
     
                                    alleleAmount = (float) 0.5;
                                    pk1.setAlleleId(alleleT1.substring(0));
                                    pk2.setAlleleId(alleleT2.substring(0));
                                    all1.setClePrimaire(pk1);
                                    all2.setClePrimaire(pk2);
     
                                    all1.setAlleleAmount(alleleAmount);
                                    all1.setComment(commentT.substring(0));
                                    all1.setDiscard(false);
                                    all1.setDye(dyeT.substring(0));
     
                                    all1.setPeak(Double.valueOf(peakT1.substring(0)));
                                    all1.setQuality(Integer.parseInt(qualT1.substring(0)));
                                    all1.setRun(runT.substring(0));
                                    all1.setVolume(Integer.parseInt(volumeT1.substring(0)));
     
     
                                    all2.setAlleleAmount(alleleAmount);
                                    all2.setComment(commentT.substring(0));
                                    all2.setDiscard(false);
                                    all2.setDye(dyeT.substring(0));
                                    all2.setPeak(Double.valueOf(peakT2.substring(0)));
                                    all2.setQuality(Integer.parseInt(qualT2.substring(0)));
                                    all2.setRun(runT.substring(0));
                                    all2.setVolume(Integer.parseInt(volumeT2.substring(0)));
     
                                    listeAllResSample.add(all1);
                                    listeAllResSample.add(all2);
     
     
     
                                    sampleT.delete(0, sampleT.length());
                                    locusT.delete(0, locusT.length());
                                    runT.delete(0, runT.length());
                                    dyeT.delete(0, dyeT.length());
                                    alleleT1.delete(0, alleleT1.length());
                                    peakT1.delete(0, peakT1.length());
                                    qualT1.delete(0, qualT1.length());
                                    volumeT1.delete(0, volumeT1.length());
                                    alleleT2.delete(0, alleleT2.length());
                                    peakT2.delete(0, peakT2.length());
                                    qualT2.delete(0, qualT2.length());
                                    volumeT2.delete(0, volumeT2.length());
                                    commentT.delete(0, commentT.length());
     
     
     
                                }
                                t++;
                            } // fin while
     
                            Projet p = psbl.findProjet(projetId);
                            p.getListeAllResSample().addAll(listeAllResSample);
                            psbl.updateProjet(p);
                            doDeleteFile();
     
                        } catch (IOException ex) {
                            Logger.getLogger(importAccGermSamp.class.getName()).log(Level.SEVERE, null, ex);
                        }
     
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(importAccGermSamp.class.getName()).log(Level.SEVERE, null, ex);
                    }
     
                }
     
                FacesContext facesContext = FacesContext.getCurrentInstance();
                FacesMessage message2 = new FacesMessage();
                message2.setSeverity(message2.SEVERITY_INFO);
                message2.setSummary("l'import des données est terminé");
                facesContext.addMessage(null, message2);
     
     
     
                long end = System.currentTimeMillis();
                float time = (end - begin) / 1000;
                System.out.println("time doImport() : " + time);
     
                doDeleteFile();
     
                return "";
            } else {
     
                FacesContext facesContext = FacesContext.getCurrentInstance();
                FacesMessage message2 = new FacesMessage();
                message2.setSeverity(message2.SEVERITY_ERROR);
                message2.setSummary("Aucun Import n'a été effectué");
                facesContext.addMessage(null, message2);
     
                doDeleteFile();
     
     
                return "";
            }
        }

  6. #6
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Bonjour,
    je m'incruste juste pour dire StringTokenizer est déconseillé par Sun qui recommande plutôt l'utilisation de la méthode split() ou des regexp.
    Raison de plus si tu veux juste séparer des champs selon le ";"

    En fait pour ce que tu en fais uniquement gérer des String resterait le plus simple et le plus efficace je pense

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

Discussions similaires

  1. gestion d'un String
    Par nypahe dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 15/04/2009, 15h33
  2. [XML] gestion des string vide?
    Par bakonu dans le forum C#
    Réponses: 11
    Dernier message: 15/03/2008, 00h52
  3. [débutant] Gestion retour à la ligne d'une String dans une JSP
    Par caballero dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 26/02/2008, 12h14
  4. gestion de string
    Par marco80 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/05/2007, 11h34
  5. [VB] gestion des couleurs des variables de type string
    Par landry005 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/03/2006, 14h36

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