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 :

[Perf] Optimiser la lecture d'un fichier de taille > 2 m


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 57
    Points
    57
    Par défaut [Perf] Optimiser la lecture d'un fichier de taille > 2 m
    bnjr

    je devlp actuellement une application de decodage d'un format BER (basic encoded rule standard ASN.1)
    mon application doit avoir un temp de reponse < 2min
    mon probleme que la lecture depuis un fichier (java.io.*) avec le langage java s' avere tres lente (jvm+io+...) > 20min (si le fichier depasse les 2mo ) en plus du traitement de decodage sur le fichier >4min

    si qql coné une solution autre que l'utilisation des stream????

    voici le code en question!!!
    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
    //******************************************************
    ......
     
    StringBuffer contenu = new StringBuffer();
    try {
    			FileInputStream in = new FileInputStream(infile);
    			BufferedInputStream bfin = new BufferedInputStream(in);
    			FileOutputStream out = new FileOutputStream(outfile);
    			BufferedOutputStream bfout = new BufferedOutputStream(out);
     
    			int myread;
    			// lecture du contenu du fichier cdr
    			while ((myread = bfin.read()) != -1)
     
    			{
    				contenu.append((char) myread);
     
    			}
     
    			// mettre le buffer string contenu dans une string tmp
     
    			String tmp = "";
    			for (int i = 0; i < contenu.length(); i++) {
    				tmp += contenu.charAt(i);
     
    			}
     ........
    //***************************************************


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    ghorgor m'a dit dans un autre post :

    Si tu veux l'accelerer quand meme, fais une lecture par bloc de 5000 octets par exemple, et fais un decoupage sur les retour chariots/nouvelle ligne (\r\n), afin de retrouver tes lignes...

    Il faut cependant faire gaffe aux fins de lecture, ne se terminant pas par un \r\n...

    Les acces en lecture sont assez couteux, du coup, en limitant le nombre d'acces, tu risques d'accelerer considerablement ton traitement...

    J'ai fait une appli qui doit modifier des flux en EBCDIC de cette maniere, et je fais la lecture / ecriture d'un fichier de 250 Mo en 5 minutes...
    je peux pas t'en dire plus, je ne connais pas d'autre moyen que java.io. ......

  3. #3
    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 Re: comment optimiser la lecture d'un fichier de taille >
    Salut,

    Penses à mettre toi même les balises [ code ] la prochaine fois... c'est plis lisible

    Maintenant pourquoi est-ce que tu fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    			// mettre le buffer string contenu dans une string tmp
     
    			String tmp = "";
    			for (int i = 0; i < contenu.length(); i++) {
    				tmp += contenu.charAt(i);
     
    			}
    L'opérateur + sur les String (ou += qui revient au même) ne dois JAMAIS être utilisé dans une boucle car cela implique la création/destruction de chaine temporaire à chaque tour ce qui est très lent...
    Dans ces cas là il faut utiliser un StringBuffer !!!!!!!!

    En plus tu l'utilises déjà pour la lecture du fichier !!!! Je suis sûr que la boucle de lecture du fichier est + rapide que cette boucle là !!!!

    Si tu veux 'convertir' ton StringBuffer en String, il suffit d'utiliser la méthode toString() qui elle est optimisé (pas de création d'une nouvelle chaine si le StringBuffer n'est plus modifié par la suite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String tmp = contenu.toString();
    a++

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 57
    Points
    57
    Par défaut Re: comment optimiser la lecture d'un fichier de taille >
    je ne crois pas que cette boucle est responsable de la lenteur du prog

    car j'ai tester deja le code sans cette boucle,,,elle ne sert absolument a rien!!!!

    pour la lecture d'un bloc de 5000 à travers la methode read(byte[] b)

    en qoui ca pourrait ameliorer le tmp de rep???

    puisseque je croi que le nombre d'acces au disque reste le meme.........

    .

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Une autre possibilité d'amélioration serait d'augmenter la taille du tampon de lecture de BufferedInputStream (taille par défaut 2024bytes). J'initialiserai la taille à 10kbytes (10*1024):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BufferedInputStream bfin = new BufferedInputStream(in, 10*1024);
    Bien le bonjour chez vous
    Jowo

  6. #6
    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 Re: comment optimiser la lecture d'un fichier de taille >
    Citation Envoyé par sacofan
    je ne crois pas que cette boucle est responsable de la lenteur du prog

    car j'ai tester deja le code sans cette boucle,,,elle ne sert absolument a rien!!!!
    Et moi je ne crois pas : j'en suis sûr !!!
    Entoure la de System.currentTimeMillis() pour voir le temps qu'elle met...

    Citation Envoyé par sacofan
    pour la lecture d'un bloc de 5000 à travers la methode read(byte[] b)

    en qoui ca pourrait ameliorer le tmp de rep???

    puisseque je croi que le nombre d'acces au disque reste le meme.........
    C'est différent de lire 2 000 000 fois 1 caractères que de lire 400 fois 5000 caractères...
    C'est l'accès au disque qui est le plus lent... La lecture est plus rapide.
    Donc pour de gros fichiers c'est préférable de lire par bloc plutot que caractère par caractère...

    Mais tu n'as pas besoin de le faire car c'est déjà fait par le BufferedInputStream. Par contre tu peux augmenter la taille de son buffer comme l'indique jowo...

    Ce que tu pourrais encore faire, même le gain ne sera pas forcément très grand, c'est d'initialisé ton StringBuffer à la taille de ton fichier...

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 57
    Points
    57
    Par défaut Re: comment optimiser la lecture d'un fichier de taille >
    Citation Envoyé par adiGuba
    Citation Envoyé par sacofan
    je ne crois pas que cette boucle est responsable de la lenteur du prog

    car j'ai tester deja le code sans cette boucle,,,elle ne sert absolument a rien!!!!
    Et moi je ne crois pas : j'en suis sûr !!!
    Entoure la de System.currentTimeMillis() pour voir le temps qu'elle met...

    Citation Envoyé par sacofan
    pour la lecture d'un bloc de 5000 à travers la methode read(byte[] b)

    en qoui ca pourrait ameliorer le tmp de rep???

    puisseque je croi que le nombre d'acces au disque reste le meme.........
    C'est différent de lire 2 000 000 fois 1 caractères que de lire 400 fois 5000 caractères...
    C'est l'accès au disque qui est le plus lent... La lecture est plus rapide.
    Donc pour de gros fichiers c'est préférable de lire par bloc plutot que caractère par caractère...

    Mais tu n'as pas besoin de le faire car c'est déjà fait par le BufferedInputStream. Par contre tu peux augmenter la taille de son buffer comme l'indique jowo...

    Ce que tu pourrais encore faire, même le gain ne sera pas forcément très grand, c'est d'initialisé ton StringBuffer à la taille de ton fichier...

    ok merci je crois que ca marche

    j'ai suivi les 2 astuces

    j'ai obtenu un temp de reponse < 1min
    ca donne ca:



    //***********************************************************
    try {
    FileInputStream in = new FileInputStream(infile);
    BufferedInputStream bfin = new BufferedInputStream(in,2*1024*1024);
    FileOutputStream out = new FileOutputStream(outfile);
    BufferedOutputStream bfout = new BufferedOutputStream(out);

    int myread;
    // lecture du contenu du fichier cdr
    byte[] b=new byte[1024];
    while ((myread = bfin.read(b)) != -1)

    {
    for (int jjj=0;jjj<1024;jjj++) {
    myread=(int)b[jjj];
    contenu.append((char) myread);
    }

    }

    ////////////////////////***

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Etant auteur du post de depart qui a ete cité, je te garantis que c'est FRANCHEMENT plus rapide, je te le dis d'experience... Essayes, tu verras le resultat...

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

Discussions similaires

  1. Optimisation de lecture de lourds fichiers CSV
    Par kidpaddle2 dans le forum C++
    Réponses: 27
    Dernier message: 21/06/2010, 19h55
  2. [ksh]Optimiser la lecture de gros fichiers gz.
    Par xodblux dans le forum Linux
    Réponses: 5
    Dernier message: 09/12/2008, 23h03
  3. Optimisation de lecture de gros fichier
    Par uriotcea dans le forum Windows
    Réponses: 3
    Dernier message: 23/11/2006, 19h00
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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