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

Langage Java Discussion :

Ecriture d'une list() dans un fichier Pb d'optimisation


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Points : 34
    Points
    34
    Par défaut Ecriture d'une list() dans un fichier Pb d'optimisation
    bonjour,

    je souhaiterais avoir un avis sur une solution technique.

    je dispose d'une application qui fait des calculs et qui initialise une List() avec 3000 "elements" de 100 caracteres (en moyenne). (ici la list me sert de tampon pour eviter de stocker tes les resultats des calculs en memoire)

    jusqu' la pas de Pb

    apres je dois ecrire dans un fichier les resultats (3000 x 100 caracteres en moyenne) , pour cela j'utilise une boucle for qui ajoute 100caracteres + 1saut de ligne .... jusqu'a disposé d'un string de 300000 caracteres qui seront ecrie (pas de Pb non plus)

    Mon pb vient du temps mis par ma boucle for pour realiser l'initialisation de mon tampon de 300000 caracteres.

    Donc ma question : est-il possible de gagner du temps dans mon for ?(exemple si j'ai 1 000 000 de resultats divisé par 3000 et que le for prend 15 sec je dois attendre 5000 secondes avant de pouvoir disposé de mon fichier de sortie.)

    je rajoute un peu de code pour mieux comprendre.

    Merci pour vos conseils

    Sebastien

    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
     
    //traitement qui initialise list (3000 "lignes" de 100 caracteres) 
     
    if (list.size()==3000)
    {
     
    	for (int boucle=0;boucle<list.size();boucle++)
    	{
     
    		if (tampon=="")
    		{
    			tampon = list.get(boucle).toString();	
    		}
    		else							
    		{
    			tampon = tampon+"\n"+list.get(boucle).toString();
    		}
     
     
    	}
    	System.out.println("Ecriture ds le fichier.txt");
    	Ecriture(tampon);
    	tampon="";
    	list.clear();
    }

    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
     
    		public static void Ecriture(String tampon)
    		{
    			try 
    			{		 		
    				FileWriter flux = new FileWriter("EnTest.txt",true);
    				BufferedWriter tampon = new BufferedWriter(flux);
     
    				tampon.write(tampon);			
    				tampon.newLine();			  
    				tampon.close();				
    				flux.close();
    			}
    			catch (IOException e ) 
    			{
    				System.out.println("ERREUR : Il y a eu une erreur lors de l'ecriture des resultats dans le fichier ");
    				e.printStackTrace();
    			}
     
    		}

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    C'est faux ton truc (enfin il me semble sérieusement) !
    Tu vas te retrouver avec un fichier du type :
    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
    1e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    3e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    3e element de ma liste
    4e element de ma liste
    
    ...
    car à chaque passage tu ajoutes à ton fichier tout ce que tu lui as déjà écrit, plus la nouvelle.

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Pour la concaténation tu devrais passer par un StringBuilder :
    cf FAQ : Comment concatener des chaînes de caractères ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    StringBuilder tampon = new StringBuilder();
    for (int boucle=0;boucle<list.size();boucle++) {
         tampon.append(list.get(boucle).toString());
    }
    System.out.println("Ecriture ds le fichier.txt");
    Ecriture(tampon);

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par g_rare
    C'est faux ton truc (enfin il me semble sérieusement) !
    Tu vas te retrouver avec un fichier du type :
    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
    1e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    3e element de ma liste
    
    1e element de ma liste
    2e element de ma liste
    3e element de ma liste
    4e element de ma liste
    
    ...
    car à chaque passage tu ajoutes à ton fichier tout ce que tu lui as déjà écrit, plus la nouvelle.
    regarde mieux tu verras que cela fonctionne !

    Pour la concaténation tu devrais passer par un StringBuilder :
    cf FAQ : Comment concatener des chaînes de caractères ?


    Code :
    StringBuilder tampon = new StringBuilder();
    for (int boucle=0;boucle<list.size();boucle++) {
    tampon.append(list.get(boucle).toString());
    }
    System.out.println("Ecriture ds le fichier.txt");
    Ecriture(tampon);
    ok merci pour l'information je vais essayer avec StringBuffer a cause que je dois rester en jdk 1.4.

    par contre j'ai fais differents essai avec un string "normal" et la taille de la list influe beaucoup sur la rapidité ..... je vais essayer avec StringBuffer pour voir si cela est plus rapide.

    encore merci pour l'info.

    Sébastien

  5. #5
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    StringBuilder c'est sous la JDK 1.5 Tiger, sinon tu utilises StringBuffer; StringBuilder est à utiliser si tu n'as pas à gérer le threading.

    A+

  6. #6
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Fais aussi attention à ça :

    utilise plutôt equals pour comparer 2 String.
    Il vaudrait mieux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ("".equals(tampon))

  7. #7
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par sebastien2222
    regarde mieux tu verras que cela fonctionne !
    +1

    Par contre, il me semble que les Buffers existe pour "flusher" régulièrement les données (pas un seul gros bloc) :
    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
    public static void Ecriture(List list) {
      FileWriter flux = null;
      BufferedWriter tampon = null;
      try {		 		
        flux = new FileWriter("EnTest.txt",true);
        tampon = new BufferedWriter(flux);
        for (int boucle=0;boucle<list.size();boucle++) {		
          tampon.write(list.get(boucle).toString());			
          tampon.newLine();			  
          tampon.flush();
      }
      catch (IOException e ) {
        System.out.println("ERREUR : Il y a eu une erreur lors de l'ecriture des resultats dans le fichier ");
        e.printStackTrace();
      }
      finally {
        if (tampon != null) {
          tampon.close();				
        }
        if (flux != null) {
          flux.close();
        }
      }			
    }

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    autre chose avec un StringBuffer on fait comment pour le "vider" pour le réutiliser une nouvelle fois ?

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb = new Stringbuffer();
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb.delete(0, sb.length());
    Pour plus d'infos -> Javadoc : StringBuffer

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    = new StringBuffer()

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    une derniere question pour la route : si je initialise pas a la creation il prend quelle taille mon stringbuffer ?

  12. #12
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    Citation Envoyé par sebastien2222
    une derniere question pour la route : si je initialise pas a la creation il prend quelle taille mon stringbuffer ?
    Citation Envoyé par La Javadoc donné en lien par le y@m's
    Constructor Summary
    StringBuffer()
    Constructs a string buffer with no characters in it and an initial capacity of 16 characters.
    A+

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

Discussions similaires

  1. Ecriture d'une image dans un fichier
    Par davidou2001 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/06/2007, 15h20
  2. COmment enregitrer une liste dans un fichier
    Par flo64 dans le forum Access
    Réponses: 13
    Dernier message: 14/06/2006, 10h07
  3. Stocker une liste dans un fichier
    Par Knuckles dans le forum Général Python
    Réponses: 1
    Dernier message: 29/05/2006, 08h08
  4. Ecrire le contenu d'une List dans un fichier
    Par sabure dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/05/2006, 16h33
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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