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

Entrée/Sortie Java Discussion :

Optimisation lecture fichier > 3 Mo


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut Optimisation lecture fichier > 3 Mo
    Bonjour,

    Existe t-il actuellement une méthode plus rapide que BufferedReader avec readLine() pour lire un fichier ligne par ligne ?


    Cordialement,
    Seb

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Sebastien_INR59 Voir le message
    Existe t-il actuellement une méthode plus rapide que BufferedReader avec readLine() pour lire un fichier ligne par ligne ?
    Cela existe peut-être... mais je ne pense pas que la différence soit si significative que cela sur un fichier de 3 Mo


    Si tu as un problème de performance il doit surement venir d'autre part...

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    En faite en C#, avec le même algo, cela prend moitié moins de temps. Je voudrais au moins égaler la performance voire l'améliorer.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sebastien_INR59 Voir le message
    En faite en C#, avec le même algo, cela prend moitié moins de temps. Je voudrais au moins égaler la performance voire l'améliorer.
    Et on pourrait voir le code ???

    a++

  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Tu peux essayer d'augmenter la taille du BufferedReader progressivement jusqu'à 3Mo. Mais comme cela a été dit, pour un fichier de cette taille, je doute que ce soit la lecture qui prenne le plus de temp.
    Sinon tu peux essayer avec les classes du package java.nio. On est souvent agréablement supris avec ce package (sur des fichiers supérieurs à 2Go, il m'est arrivé de voir les temps de traitement divisés jusqu'à 20 !).

  6. #6
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Essai en utilisant le package java.nio

    java.io utilise une philosophie de stream (gestion byte par byte) des données
    java.nio utilise une philosophie de buffer (gestion block par block) des données

    nio est plus efficace nottament pour les gros fichiers

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Voici pour le code demandé plus haut:

    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
     
                BufferedReader in = new BufferedReader(new FileReader(sPathFileI));
     
                 String sLine ....
     
    ...
     
                 while ((sLine = in.readLine()) != null) {
     
                	 sArr = sLine.split(s_Delim);
     
                     if (!arr_IdTx.contains(sArr[0])) arr_IdTx.add(sArr[0]);
     
                 }
                 in.close();
    C'est au niveau de la boucle ... au moins 50 secondes de traitement.

    Cordialement,
    Seb

  8. #8
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Ya pas grand chose à optimiser dans ton code. Essai avec java.nio.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Cela pourrait venir de split() qui utilise des expressions régulières : pour chaque ligne le pattern est recompilé et c'est l'opération la plus couteuse des expressions régulières, même pour une expression assez simple...

    Si tu as un grand nombre de ligne cela peut être assez pénalisant.

    Dans ce cas deux solutions :
    • Soit tu compiles le pattern AVANT la boucle et tu l'utilises simplement pour le split() :
      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
              BufferedReader in = new BufferedReader(new FileReader(sPathFileI));
              try {
      	        String sLine = null;
      	        Pattern splitPattern = Pattern.compile(s_Delim);
       
      	        while ((sLine = in.readLine()) != null) {
       
      	       	 	sArr = splitPattern.split(sLine);
       
      	            if (!arr_IdTx.contains(sArr[0])) arr_IdTx.add(sArr[0]);
       
      	        }
              } finally {
              	in.close();
              }
    • Soit tu n'as pas besoin d'une expression régulière et tu peux utiliser directement indexOf() :
      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
              BufferedReader in = new BufferedReader(new FileReader(sPathFileI));
              try {
      	        String sLine = null;
       
      	        while ((sLine = in.readLine()) != null) {
      	       	    int index = sLine.indexOf(s_Delim);
      	       	    if (index>=0) {
      	       	    	String substring = sLine.substring(0, index);
      	       	    	if (!arr_IdTx.contains(substring)) arr_IdTx.add(substring);
      	       	    }
       
      	        }
              } finally {
              	in.close();
              }


    a++

    PS : Comme tu as pu le remarquer dans le code, je te conseille d'utiliser des try/finally pour fermer le flux

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Un grand merci pour cette aide.

+ 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, 12h17
  2. Optimisation lecture fichier via un shell script
    Par macleod dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/07/2007, 13h46
  3. optimiser lecture fichier image
    Par cheho dans le forum C++
    Réponses: 17
    Dernier message: 15/09/2006, 15h14
  4. Optimisation lecture d'un fichier en binaire
    Par User dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/10/2005, 22h08

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