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 :

Problème de mémoire


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut Problème de mémoire
    Bonjour,

    J'ai une petit problème de out of memory et je ne sais pas trop d'ou peut venir la fuite (en esperant que ce n'est pas tout simplement le tableau en construction qui est trop gros)

    donc je fais un tableu de ... 600 000 objets le objets ne sont pas enorme (5 variable texte et leur method d'accès)

    Sur linux c'est long mais aucun problème ... sous window et mac ca pete (au même endroit .. je dois avoir la même limite pour les 2 mais c'est Eclipse et je ne sais pas où regarder)

    Je fais en fait une boucle while 6000 fois. celle-ci appelans une methode où une boucle est faite 100 fois ... Ce peut t'il que les variables intermerdiaire ne soit pas libéré ?

    le code (pas optimisé mais je ne sais trop par ou commencer)

    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
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Collections;
     
    import javax.swing.JCheckBox;
    import javax.swing.JPanel;
     
     
    public class AlignementMap extends JPanel{
     
    	ArrayList _mapResults;
    	AlignMapParamSet _param; 
    	MapMain _parent;
    	private static final long serialVersionUID = 49L;
     
    	AlignementMap(AlignMapParamSet param, MapMain parent)
    	{
    		_param = param;
    		_parent = parent;
     
    		MapCalcul();
    	}
     
    	private void MapCalcul()
    	{
    		_mapResults = new ArrayList();
    		int period;
     
    		System.out.println(System.currentTimeMillis());
    		int i = 0 ;
    		while( i< 6000)
    		{
    			period = 100;
    			ArrayList distribution = createDistribution(period);
    			_mapResults.add(distibutionResults(distribution, period));
    			i++;
    		}
    		System.out.println(System.currentTimeMillis());
    	}
     
    	private ArrayList createDistribution(int period)
    	{
    		ArrayList genes = _parent.getGeneList();
    		ArrayList distribution = new ArrayList();
    		for (int i = 0; i< genes.size(); i++)
    		{
    			int modulo = ((GenePoint)genes.get(i)).getPosition() % period;
    			distribution.add(modulo/(double)period);	
    		}
     
    		return distribution;
    	}
     
    	private BestAlignementParamSet[] distibutionResults(ArrayList distribution, int period)
    	{
    		double error = 0.01;
    		BestAlignementParamSet[] errorsBA = new BestAlignementParamSet[100];
     
    		for (int i = 0; i<99 ; i++)
    		{
    			score best = BestAlignementfor(distribution, error);
    			ArrayList baArea = new ArrayList();
    			double pValue = pValue(best._score,_parent.getGeneList().size(), error );
    			float phase = (float)(best._position+ error/2);
    			baArea.add(new BAAreaParam(_param.getStart(),_param.getEnd(), (float)error, phase, pValue ));
    			if (phase > 1) phase = phase - 1;
    			errorsBA[i] = new BestAlignementParamSet(period, _param.getStart(), _param.getEnd() ,pValue, false, phase, _param.getStart(), baArea, period+"/"+error);
    			error = error + 0.01;
    		}
     
    		return errorsBA;
    	}
     
    	private score BestAlignementfor(ArrayList distribution, double error)
    	{
    		ArrayList sumList = new ArrayList();
    		ArrayList scoreList = new ArrayList();
    		int sum = 0;
     
    		for (int i = 0 ; i< distribution.size(); i++)
    		{
    			double pos =  (Double)distribution.get(i);
    			sumList.add(new score(pos,-1));
    			sumList.add(new score(pos - error, 1));
    			if (pos <= error)  sum++; // initilization with the gene in the first error window
    		}
    		Collections.sort(sumList);
    		scoreList.add(new score(0, sum));
    		double medPosition;
    		int max = sum;
    		int maxIndice = 0;
    		for (int i = 1 ; i < sumList.size(); i ++)
    		{
    			sum = sum + ((score)sumList.get(i-1))._score;
    			medPosition = ((score)sumList.get(i-1))._position +  (((score)sumList.get(i))._position -  ((score)sumList.get(i-1))._position)/2;
    			scoreList.add(new score(medPosition, sum));
    			if (sum> max)
    			{
    				max = sum;
    				maxIndice = i;
    			}
    		}
    		sum = sum + ((score)sumList.get( sumList.size()-1))._score;
    		medPosition = ((score)sumList.get( sumList.size()-1))._position +  (1 -  ((score)sumList.get( sumList.size()-1))._position)/2;
    		scoreList.add(new score(medPosition, sum));
    		if (sum> max)
    		{
    			max = sum;
    			maxIndice =  sumList.size();
    		}
     
    		return	(score)scoreList.get(maxIndice);
    	}
     
    	private double pValue(int nbGenes, int nbGenesIn, double error)
    	{
    	double logPVal = 0;
     
    	double sum = 0;
    	for (int i = 1 ; i<= nbGenes; i++)
    	{
    		sum = sum + Math.log(i);
    	}
    	logPVal = sum;
     
    	sum = 0;
    	for (int i = 1 ; i<= nbGenesIn; i++)
    	{
    		sum = sum +  Math.log(i);
    	}
    	logPVal = logPVal - sum;
     
    	sum = 0;
    	for (int i = 1 ; i<= (nbGenes - nbGenesIn); i++)
    	{
    		sum = sum +  Math.log(i);
    	}
    	logPVal = logPVal - sum;
     
    	logPVal = logPVal+nbGenesIn* Math.log(error) + (nbGenes - nbGenesIn) * Math.log(1 - error);
    	return Math.exp(logPVal);
    	}
     
     
    	private class score implements Comparable
    	{
    		double _position;
    		int _score;
    		score(double position, int score)
    		{
    			if (position < 0) position = 1 + position;
    			_position = position;
    			_score = score;
    		}
     
    		public int compareTo(Object o) {
    			return( Double.compare(_position, ((score)o)._position));
    		}
    	}
    }

  2. #2
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    La memoire associée à la jvm par defaut est différente selon les OS : 64MO sous Windows, 256MO sous linux (je ne me souviens plus pour MacOS), ce qui explique ton probleme sous Windows.
    Tu peux temporairement resoudre le probleme en allouant plus de memoire a ta jvm en passant comme argument -Xmx256m cependant je te conseille d'eventuellement revoir ton code pour voir si tu ne peux pas te passer d'avoir en meme temps en memoire tous ces objets.
    edit : tu pourrais avoir un gain de temps important en considerant l'arraylist distribution comme un attribut (ou variable de classe meme) et non comme une variable locale étant donné que tu sais que tu passe un certain nombre de fois dans la methode

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    Citation Envoyé par leyee
    La memoire associée à la jvm par defaut est différente selon les OS : 64MO sous Windows, 256MO sous linux (je ne me souviens plus pour MacOS), ce qui explique ton probleme sous Windows.
    Tu peux temporairement resoudre le probleme en allouant plus de memoire a ta jvm en passant comme argument -Xmx256m cependant je te conseille d'eventuellement revoir ton code pour voir si tu ne peux pas te passer d'avoir en meme temps en memoire tous ces objets

    oui surtout que mon mac a une ram de 256 ... donc je vais essayer de faire marcher ca en 64 Mo ... hum c'est vrai que si mon tableau fait 600 000 et chacun des objet fait 10ko c'est déjà trop .... je vais essyer d'utiliser des objets plus petit ou peut être la serialisation mais j'ai besoin par la suite d'un accès rapide a n'importe quel objet ... je vais voir.


    Y a t'il une methode pour connaitre la taille mémoire pris par un tableau ou une arraylist ?

  4. #4
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Citation Envoyé par Lady
    oui surtout que mon mac a une ram de 256 ... donc je vais essayer de faire marcher ca en 64 Mo ... hum c'est vrai que si mon tableau fait 600 000 et chacun des objet fait 10ko c'est déjà trop .... je vais essyer d'utiliser des objets plus petit ou peut être la serialisation mais j'ai besoin par la suite d'un accès rapide a n'importe quel objet ... je vais voir.


    Y a t'il une methode pour connaitre la taille mémoire pris par un tableau ou une arraylist ?
    d'un autre coté 10ko pour un objet ça fait deja pas mal selon les attributs que tu sauve dedans. Il n'y apas d'operateur sizeof comme dans d'autres langages pour connaitre la taille des objets. A ma connaissance la meilleure solution est d'utiliser un profiler (tptp pour eclipse ou le profiler de netbean par exemple), pour voir ce que ça donne

  5. #5
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    Citation Envoyé par leyee
    d'un autre coté 10ko pour un objet ça fait deja pas mal selon les attributs que tu sauve dedans. Il n'y apas d'operateur sizeof comme dans d'autres langages pour connaitre la taille des objets. A ma connaissance la meilleure solution est d'utiliser un profiler (tptp pour eclipse ou le profiler de netbean par exemple), pour voir ce que ça donne

    ok ... bon j'ai utiliser un objet alléger dans mon tableau et ca marche .. problème il est possible que j'ai plusieurs tableau de cette taille a la fois ... je pense qu'il faut que je passe par de la mise en memoire dure de toute facon (et puis ca évite de refaire le calcul de 5 min à chaque fois lol )...

    je vais voir pour le profiler ^^ Merci

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Lady
    Y a t'il une methode pour connaitre la taille mémoire pris par un tableau ou une arraylist ?
    Tu peux aussi utiliser JProbe: c'est un profiler java très efficace (mais malheureusement également très coûteux...)
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Tiens je ne connaissais pas : comment fonctionne t il ? peut l'integrer a clipse par exemple ou fonctionne il en standalone ?

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

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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