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

Java Discussion :

Probleme mémoire fonction comparaison fichier


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Par défaut Probleme mémoire fonction comparaison fichier
    Bonjour,

    je dois ecrire un programme permettant de comparer un fichier assez volumineux en sortit 1 rapport d'erreur et une visuel des différences a l'ecran.

    mon programme marche tres bien sur des petits fichiers cependant des que le fichiers devients assez volumineux celui ci rame enormement.

    je pensse que cela est du a la taille mémoire trop important de ma variable rapport et visuel.

    mon but étant dafficher ce rapport a l'ecran donc par l'intermédiaire d'une fenetre d'un texarea.C'est pour cela que je stock mes informations dans un type STRING.

    auriez vous une autre idée de methode ?
    programme ci joint
    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
    public class comparaison  extends Thread
    {
    	String rapport;
    	String exep_file;
    	String regle_file;
    	fenetrePrincipale mainFen;
    	FileInputStream fichier1;
    	FileInputStream fichier2;
     
     
    	public void setExeptFile(String file)
    	{
    		exep_file=file;
    	}
     
    	public void setRegleFile(String file)
    	{
    		regle_file=file;
    	}
     
    public void run ()
    	{
     
    		chargement dwl = new chargement(regle_file);
    		chargement exep = new chargement(exep_file);
    		int cpt2=0;
    		int pos=1;
    		int line=0;
    		int cpt=0;
    		int cptexep=0;
    		String ligne_rapport;
    		boolean erreur=false;
    		boolean regle=false;
    		boolean exeption=false;
    		boolean err=false;
    		rapport="RAPPORT COMPARAISON : \n";
    		String visuel;
    		visuel = "Visualisation des ecarts : \n\n";
     
    		try 
    		{	
    			InputStreamReader streamReader1=new InputStreamReader(fichier1);
    			BufferedReader buffer1=new BufferedReader(streamReader1);
    			String line1="";
     
    			InputStreamReader streamReader2=new InputStreamReader(fichier2);
    			BufferedReader buffer2=new BufferedReader(streamReader2);
    			String line2="";
    			mainFen.textArea_resultat_comparaison.setText("Chargement ...");
     
    			while ( null!=(line1=buffer1.readLine()) && null!=(line2=buffer2.readLine()))
    			{
    				line++;
    				visuel=visuel+"\n";
    				pos=1;
    				cpt=0;
    				System.out.print(line+"\n");
    				if (rapport.length()>40000)
    				{
    					rapport = "Nombre d'erreurs anormales, le programme ne peut continuer.\n\n"+rapport;
    					break;
    				}
     
    				while( cpt < line1.length()  )
    				{
    					if(line1.charAt(cpt) != line2.charAt(cpt))
    					{
    						while(cptexep!=exep.len)
    						{
    							if(exep.pos_d[cptexep]<=pos && exep.pos_f[cptexep]>=pos )
    							{
    								exeption=true;
    							}
    							cptexep++;
    						}
    						if(exeption==false)
    						{
    							visuel=visuel+line1.charAt(cpt);
    							erreur=true;
    							err=true;
    							while(cpt2!=dwl.len)
    							{
    								if(dwl.pos_d[cpt2]<=pos && dwl.pos_f[cpt2]>=pos )
    								{	
    									ligne_rapport = "\n Erreur enregistré : "+dwl.libelle[cpt2]+" line : "+line+" pos : "+pos;	
    									rapport += ligne_rapport;
     
    									regle=true;
    								}
    								cpt2++;
    							}
    							if(regle==false)
    							{
    								ligne_rapport = "\n Erreur non enregistré line : "+line+" pos : "+pos;
    								rapport += ligne_rapport;
    							}
    						}
    						if(err==false)
    						{
    							visuel=visuel+".";
    						}
    					}else{visuel=visuel+".";}
    					cpt++;
    					cpt2=0;
    					pos++;
    					exeption=false;
    					regle=false;
    					err=false;
     
    					cptexep=0;
    				}
     
    			}
    			if (erreur==false)
    			{
    				ligne_rapport = "\nLes fichiers sont identiques ";
    				rapport += ligne_rapport;
     
    			}
    			mainFen.textArea_resultat_comparaison.setText(rapport);
    			fichier1.close();
    			fichier2.close();
    			System.out.print(visuel);
     
    		}
     
    		catch (FileNotFoundException e) 
    		{
    		} 
    		catch (IOException e) 
    		{
    		}
     
    	}	
    }

  2. #2
    Membre éclairé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Par défaut
    As-tu essayé d'augmenter la mémoire que tu alloues au lancement de ton appli ?


    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar -Xms512m (valeur minimum) -Xmx1024m (valeur maximum) .......

  3. #3
    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,
    dejà pour optimiser un peu, je te conseillerai de ne pas faire de concaténation de String en masse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    visuel=visuel+"\n";
    Ca c'est très lent quand la String devient grosse: ça alloue une nouvelle String à chaque fois => gros ralentissement.

    A remplacer par des StringBuilder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    StringBuilder sb = new StringBuilder();
    sb.append("blablabla");
    //Traitement
     
     
    //A la fin:
    String resultat = sb.toString();

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu dois à tout prix utiliser StringBuilder au lieu de String.
    En effet, plusieurs objets sont créés à chacune de tes concaténations de chaîne !
    Si le programme te semble toujours trop lent, tu dois calculer le temps passé dans chaque partie de l'algo.
    Pour des fichiers gigantesques, ta méthode de lecture n'est pas adaptée. Tu devrais utiliser toujours le même buffer et le transmettre à un BufferedInputStream. En effet, le BufferedReader construit une nouvelle String pour chaque ligne et fait un parcours de chaque octet pour trouver la fin de ligne, alors que tu pourrais intégrer la recherche de ligne dans ton algo puisque tu es déjà obligé de parcourir tous les caractères...
    Fais ces corrections, et poste à nouveau si tu rencontres encore des problèmes de performances, en postant aussi le code de la classe "chargement"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre expérimenté
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Par défaut
    Merci pour ces informations

    dans quel librairie se trouve cette classe ?

  6. #6
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Dans le JDK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.StringBuilder

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par l4r3nZu Voir le message
    Merci pour ces informations

    dans quel librairie se trouve cette classe ?
    Dans la même que String. Sinon, la javadoc est toujours une valeur sûre
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre expérimenté
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Par défaut
    Merci ca marche super bien

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

Discussions similaires

  1. Probleme mémoire: écriture gros fichier
    Par rnn430 dans le forum Débuter
    Réponses: 5
    Dernier message: 17/11/2009, 10h01
  2. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  3. [VB6]Problème de fonction
    Par mustang-ffw02 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/03/2004, 15h09
  4. Probleme pour lire un fichier Ini
    Par Sebinou dans le forum C++Builder
    Réponses: 11
    Dernier message: 10/03/2004, 23h22
  5. Probleme de fonction
    Par yenna dans le forum ASP
    Réponses: 6
    Dernier message: 01/03/2004, 14h10

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