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 :

Matrice d'Integer vs matrice d'int => java heap space


Sujet :

Langage Java

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut Matrice d'Integer vs matrice d'int => java heap space
    Bonjour,

    je travaille sur un projet qui comprend des traitements sur des images en niveaux de gris.
    Il y a peu, j'ai posté au sujet de la conception d'une classe Matrice générique.
    Pour résumer, à présent j'ai une classe abstraite Matrice qui contient les attributs et le constructeur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public abstract class Matrice<T>
    {
    	protected int nbLigne;
    	protected int nbCol;
    	protected T[][] mtx;
     
    	public Matrice(int nbLigne, int nbCol)
    	{
    		this.nbLigne = nbLigne;
    		this.nbCol = nbCol;
    	}
    [...]
    }
    et j'ai deux classes qui étendent cette classe : MatriceInt et MatriceDouble.
    Voici les constructeurs de MatriceInt :
    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
    public class MatriceInt extends Matrice<Integer>
    {
     
    	/**
             * Constructeur matrice vide
             * @param nbLigne : Nombre de lignes
             * @param nbCol : Nombre de Colonnes
             */
    	public MatriceInt(int nbLigne, int nbCol)
    	{
    		super(nbLigne, nbCol);
    		this.mtx = new Integer[nbLigne][nbCol];
    	}
     
    	/**
             * Constructeur d'une matrice a partir d'un tableau d'entiers a 2 dimensions
             * @param tableau d'entiers 2D
             */
    	public MatriceInt(Integer[][] tableau)
    	{
    		//Recuperation des dimensions de la matrice
    		super(tableau.length, tableau[0].length);
     
    		this.mtx = new Integer[nbLigne][nbCol];
     
    		//Copie de la matrice
    		for(int i=0; i<this.nbLigne; i++)
    		{
    			for(int j=0; j<this.nbCol; j++)
    				this.mtx[i][j] = tableau[i][j];
    		}
    	}	
    [...]
    }
    Les tests unitaires pour MatriceInt et MatriceDouble fonctionnent bien.
    Par contre, en lançant les tests sur le reste de l'application, ça bloque !
    Je me retrouve avec des
    java.lang.OutOfMemoryError: Java heap space
    [...]
    à chaque fois que je teste quelque chose qui fait appelle aux matrices de la classe MatriceInt.

    Je comprends pas trop d'où ça peut venir, car -sauf erreur de ma part - un Integer fait 32 bits, ce qui correspond bien à la taille d'un int (4 octets)...
    Y'a-t-il une subtilité qui m'échappe dans l'utilisation des génériques ou dans l'utilisation des Integer?

    Je sais pas du tout où chercher là, et ça m'embêterait de devoir faire machine arrière au niveau de mes classes Matrice... Alors si vous avez une idée d'où ça peut venir, merci d'avance

    PS : il va sans dire qu'avait le changement des classes Matrice, l'application marchait très bien et il n'y avait pas de problème de mémoire

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ah... Pour ce genre de chose très numérique et en de grandes quantités, ça pose pas mal de problèmes d'utiliser des génériques avec Integer ou Double au lieu de classes non génériques qui se reposent sur des types de base comme int ou double.

    Deux raisons :
    - Pour utiliser un Integer ou un Double dans un calcul, il faut sans arrêt le "sortir de sa boîte" pour en faire un int ou un double. Pour stocker le résultat obtenu, il faut mettre ce résultat dans un Integer ou un Double. Il n'y a pas besoin de le programmer car l'auto-inbox/outbox s'en charge, mais n'empêche que le programme le fait quand même. Ça bouffe du temps.

    - L'utilisation mémoire est au moins doublée : un Integer est un objet qui contient un int. Ça veut dire qu'il faut au moins stocker une référence vers cet Integer (32 ou 64 bits suivant les cas), plus l'objet lui-même (32 bits pour le int, et de l'overhead de taille inconnue.)

    À mon avis, pour des matrices numériques servant au traitement d'image, il vaut mieux renoncer à mettre le type Integer ou Double en générique, et juste faire deux implémentations distinctes héritant ce qu'elles peuvent (je suppose pas grand-chose) d'une classe mère abstraite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    ok merci pour les explications

    je m'en vais faire un jolie retour en arrière alors

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2008, 07h45
  2. [Débutant] Transformation d'une matrice 3D en une matrice 1D
    Par Alucard9800XT dans le forum MATLAB
    Réponses: 7
    Dernier message: 10/05/2007, 15h07
  3. Changer une matrice (n,m) en matrice (1,(n*m))
    Par dm_manu dans le forum MATLAB
    Réponses: 5
    Dernier message: 28/12/2006, 13h26
  4. Réponses: 18
    Dernier message: 24/07/2006, 19h30
  5. Sous matrice carrée d'une matrice carrée
    Par devils55 dans le forum C++
    Réponses: 2
    Dernier message: 13/11/2005, 19h07

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