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 :

Problème de Saturation (BufferedReader)


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Par défaut Problème de Saturation (BufferedReader)
    Bonjour
    J'utilise pour récupérer des données de pages web un BufferedReader ( BufferedReader flot=new BufferedReader(new InputStreamReader(u.openStream(),"utf-8")); u étant une url bien sur) .

    Cela marche tres bien mais lors de l'execution j'ai besion de récupérer un grand nmbre de donnée dans un grand nombre d'adresses differentes.

    Je créé un nouveau bufferdReader a chaque fois avec ma nouvelle url mais, il semble qu'au bout d'un moment la lecture soit de plus en plus lente (les 10 premieres pages sont quasi instantané mais au bout de 100 ca prend plusieurs secondes et ca va de pis en pis).

    Je suspect une saturation quelque part (mal fermé) mais j'utilise des close() a chaque fin de l'écture.

    Ya t'il autre chose a faire ?

    merci

  2. #2
    Membre Expert
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Par défaut
    Salut, tu pourrais nous montrer un peu de code ?

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Je suis actuellement confronté au même genre de problème pour lire mon fichier texte.

    Voici mon code :

    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
     
                    FileReader monFichier = null;
    		BufferedReader tampon = null;
     
    		try {
    			monFichier = new FileReader(chemin);
    			tampon = new BufferedReader(monFichier);
     
    			Dump.setText("");
    			String ligne = null;
     
    			while ((ligne=tampon.readLine())!=null) {
     
    				Dump.setText(Dump.getText()+ligne+"\n");
     
    			} 
    		} catch (IOException exception) {
    			exception.printStackTrace();
    		} finally {
    			try {
    				tampon.close();
    				monFichier.close();
    			} catch(IOException exception1) {
    				exception1.printStackTrace();
    			}
    si vous avez une idée, car pour un assez gros fichier, le process tourne dans le vide. C'est surement la taille du Buffer. Merci d'avance.

  4. #4
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    A mon avis, c'est ça qui ne va pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dump.setText(Dump.getText()+ligne+"\n");
    Il vaut mieux construire ta String avec un StringBuilder, et faire un setText à la fin.

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Oki merci beaucoup!

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Axwell
    si vous avez une idée, car pour un assez gros fichier, le process tourne dans le vide. C'est surement la taille du Buffer.
    Tout dans problème vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dump.setText(Dump.getText()+ligne+"\n");
    A chaque itération du recrée une nouvelle chaine un peu plus grande, ce qui fait que tu alloues une quantité énorme de mémoire temporaire. Par exemple si tu lis un fichier contenant 1000 ligne de 80 caractères (soit 80 Ko), tu alloueras en fait bien plus puisque tu auras crées une chaine de 80, puis une de 160, puis une de 240... jusqu'à arrivé aux 80000 caractères contenant tout ton fichier...
    Et en réalité si tu additionnes tout cela tu obtiendras plus de 39 Mo de chaines temporaires... tout cela pour lire un fichier de 80 Ko (et je ne t'explique même pas si le fichier est plus grand ce que cela peut donner).

    Pour pallier à cela il faut copier le fichier dans un StringBuffer (ou StringBuilder à partir de Java 5.0), ce qui va te permettre de mieux gérer la mémoire...

    Sinon j'ai d'autre remarque sur ton code :
    • Tu peux englober les Reader les uns dans les autres, et éviter ainsi de te trainer plusieurs référence inutilement...
    • Utilise plutôt System.getProperty("line.separator") que "\n" car les fins de ligne peuvent être différentes d'un système à l'autre...
    • Respecte les conventions de nommage : pas de majuscule en début de nom de variable/attributs (Dump dump).


    Exemple :
    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
    		BufferedReader tampon = null;
     
    		try {
    			tampon = new BufferedReader(new FileReader(chemin));
     
    			StringBuffer buffer = new StringBuffer();
    			// Fin de ligne spécifique du système
    			String endl = System.getProperty("line.separator");
    			String ligne = null;
     
    			while ((ligne=tampon.readLine())!=null) {
    				buffer.append(ligne).append(endl);
    			}
    			Dump.setText(buffer.toString());
    		} catch (IOException exception) {
    			exception.printStackTrace();
    		} finally {
    			try {
    				tampon.close();
    			} catch(IOException exception1) {
    				exception1.printStackTrace();
    			}
    		}

    Tu pourrais également optimiser un peu le StringBuffer/StringBuilder en l'initialisant avec la taille du fichier (ce qui évites qu'il se redimensionnent automatiquement), mais la différence n'est pas forcément flagrante


    Sinon perso je préfère gérer moi même le buffer en faisant une lecture par bloc, et utiliser un try/finally à l'intérieur du try/catch, mais après c'est une question de "goût" :
    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
    		try {
    			Reader reader = new FileReader(chemin);
    			try {
    				StringBuffer buffer = new StringBuffer();
    				char[] cbuf = new char[8192];
    				int len;
     
    				while ((len=reader.read(cbuf))>0) {
    					buffer.append(cbuf, 0, len);
    				}
    				Dump.setText(buffer.toString());
    			} finally {
    				reader.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}

    a++

    PS : Bon en prévisualisant je vois que j'ai été grillé... j'parle trop

  7. #7
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Par contre on connait toujours pas le problème de coockie_jr. Comme dit précédemment un peu de code serait le bienvenu.

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par remika
    Par contre on connait toujours pas le problème de coockie_jr. Comme dit précédemment un peu de code serait le bienvenu.
    En même temps je ne pense pas qu'il réponde de si tôt !! C'est une remonté d'un vieux sujet : "29/07/2006, 17h01"

    a++

Discussions similaires

  1. [Toutes versions] Problème de saturation mémoire lors d'une copie de contact
    Par langkif dans le forum VBA Outlook
    Réponses: 3
    Dernier message: 25/08/2010, 10h08
  2. Problème de saturation
    Par glaine dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/03/2010, 10h54
  3. problème de saturation mémoire
    Par Mengué georges dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 17/03/2008, 21h58
  4. Client/Serveur: problème ObjectInputStream et BufferedReader
    Par Barbie-Turik dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 10/03/2008, 10h55
  5. Problème de saturation réseaux !
    Par nemesix dans le forum Dépannage et Assistance
    Réponses: 6
    Dernier message: 29/05/2006, 19h31

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