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

Collection et Stream Java Discussion :

Tableau trop grand : quelles alternatives?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Par défaut Tableau trop grand : quelles alternatives?
    Bonjour,

    J'ai un probleme de mémoire quand je crée tableau à 5 dimensions.... ça marchait bien jusqu'a 4 dimensions, mais à l'ajout d'une cinquieme, ça ne passe plus. Je comprend que ça doit être lourd, vu qu'en plus il y a des milliers lignes...
    Existe-t-il une solution alternative aux tableaux, moins couteuse en mémoire mais tout aussi rapide? J'ai pas trouvé dans les FAQ, mais quelqu'un aura peut être une idée...?



    Merci d'avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static int[][][][][] strates;
    ...
     strates = new int[Population.Pop_rec.size()][nb_strat_temporelles][X][Y][Dataset_EVOL.prof_potentielles.length];

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Salut,

    Effectivement il s'agit bien d'un problème de mémoire. Tu peux augmenter la mémoire allouée par la jvm avec l'option -Xmx, mais ça repousse le problème plus que ça ne le règle.
    Existe-t-il une solution alternative aux tableaux, moins couteuse en mémoire mais tout aussi rapide?
    Il faudrait qu'on sache ce que tu souhaites faire pour pouvoir t'aider au mieux

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu tableau va occuper la taille suivante en mémoire Population.Pop_rec.size()*nb_strat_temporelles*X*Y*Dataset_EVOL.prof_potentielles.length

    T'as vraiment besoin de tout ca de données (comme on cnnais pas les valeurs on sais pas combien ca fait) ? Si oui, alors faut augmenter la taille de la JVM.

  4. #4
    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,


    Une question : tu stockes quoi dans ces tableaux ??? Et tu utilises réellement toutes ces cases ?
    Car un tableau à 5 dimensions cela me semble énorme ! Ce doit être galère à gérer !!!


    [edit] Nos posts se sont croisés.
    Tu veux dire quoi exactement par là : "je veux enregistrer son habitat dans un environnement en 4 dimensions (date, longitude, latitude , altitude )" ???

    a++

  5. #5
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,
    Tu veux dire quoi exactement par là : "je veux enregistrer son habitat dans un environnement en 4 dimensions (date, longitude, latitude , altitude )" ???
    Je veux garder en mémoires les zones et dates qui correspondent à l'habitat de cet individu. Par exemple une anguille qui est née dans telle région de la mer (définit par lat, lon, profondeur) à telle date, hé bien pour pondre elle va rechercher un environnement qui lui convient dans une zone autour de son lieu/date de naissance. Je veux donc scanner le nouvel environnement, puis pour chaque individus enregistrer les "strates environementales" (date, longitude, latitude , profondeur) qui lui conviennent pour pondre...

    (ça fait peut être pas avancer le schmilblik, mais ça me permet de clarifier un peu pour moi aussi!)

  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
    Citation Envoyé par timbrochier Voir le message
    Je veux garder en mémoires les zones et dates qui correspondent à l'habitat de cet individu.
    Donc tu réserves une zone de mémoire référençant tous les emplacements possibles pour tous les jours de l'année...

    De plus je ne comprend pas trop le compteur : un individu peut se trouver plusieurs fois au même endroit à la même date ???


    A mon avis à trop vouloir "optimiser" tu t'embêtes comme pas possible avec un tableau énorme !


    Perso je pencherais plutôt pour un modèle objet :
    • [Une classe Position qui représenterait une position pour une date précise.
      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
      class Position {
      	private final short date;
      	private final short longitude;
      	private final short latitude;
      	private final short altitude;
       
      	public Position(short date, short longitude, short latitude, short altitude) {
      		super();
      		this.date = date;
      		this.longitude = longitude;
      		this.latitude = latitude;
      		this.altitude = altitude;
      	}
      	// + getter/setter
      }
    • Une classe Individu qui représenterait tes individus, et qui contiendrait une liste des positions de l'individu en question :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      class Individu {
       
      	private final List<Position> positions = new ArrayList<Position>();
       
      	public void add(Position p) {
      		this.positions.add(p);
      	}
      }



    a++

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    à mon avis tu dois revoir ton algo

    Pour chaque individus, je veux enregistrer son habitat dans un environnement en 4 dimensions (date (365), longitude (~100), latitude(~100 , altitude (~25 )
    Je comprends pas ce que tu veux stocker?
    Dans tous les cas n'est il pas vraisemblable qu'un individu ne bouge pas tous les jours (si c'est des humain) ...
    si c'est des oiseaux migrateurs tu dois pouvoir t'en sortir avec des coordonnées pour le groupe.

    Est ce que tu ne peux pas gagner de la place en gardant les coordonnées mais en mettant le nb d'individu sur la position?

    bonne chance

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Arg post croisé :p

    Si tu te place au niveau individuel, je pense que tu peux réduire la taille, en partant du fait que ton anguille ne doit pas bouger de beaucoup tous les jour, non?

    Ma connaissance de l'anguille n'est pas très grande je peux me tromper :p

  9. #9
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Par défaut
    Citation Envoyé par LittleBean Voir le message
    Est ce que tu ne peux pas gagner de la place en gardant les coordonnées mais en mettant le nb d'individu sur la position?
    C'est exactement ce que je faisais jusqu'ici, et ça marchait bien effectivement. Mais maintenant j'ai besoin de garder les liens de parentés, donc il faut que je sache exactement quel poisson pond dans quelle strate...

    Citation Envoyé par Astartee Voir le message
    Donc en fait tu as un immense tableau rempli principalement de 0, avec juste un seul point "1" pour chaque individu...
    Pas tout à fait, car en fait il peut y avoir un grand nombre de strates OK pour 1 seul individus (plein d'endroits qui potentielement lui conviennent pour pondre, même à la même date)

    Citation Envoyé par tchize_ Voir le message
    pourquoi d'abord stocker l'environnement poru chaque individu. Quel que soit l'individu, l'état de l'environnement en X,Y, altitude Z , jour 53 est le même. T'as donc 150.000 fois la même donnée, t'as déjà un méchant point d'amélioration là. .
    En fait je stocke pas l'environnement, mais simplement le fait que cet environnement est OK pour un individu donné. L'environnement est stocké dans des fichiers qui ne sont lu et stockés qu'une seule fois, puis comparée avec les préférences de chaque poisson.

    Mais bref, les solutions proposée par adiGuba et Astartee me paraissent bien, d'autant plus que j'ai déja une classe individus... mais j'avais pas penser à faire une classe position.

    Merci à tous!

  10. #10
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Par défaut
    Oui pour l'option Xmx je l'ai déja réglée à 2 gigas ( -Xmx2g ), je pourrais encore augmenter mais comme tu dit ça ne fait que repousser le problème.

    Ce que je veux faire n'est pas si compliqué :

    J'ai une population avec "Population.Pop_rec.size()" individus (de l'ordre de 150 000 individus)

    Pour chaque individus, je veux enregistrer son habitat dans un environnement en 4 dimensions (date (365), longitude (~100), latitude(~100 , altitude (~25 )

    Initialement je déclare donc ce fameu tableau trop grand, puis l'idée est de le remplir de 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            strates = new int[Population.Pop_rec.size()][nb_strat_temporelles][X][Y][Dataset_EVOL.prof_potentielles.length];
     
            for (int p = 0; p < Population.Pop_rec.size(); p++) {
                for (int d = 0; d < nb_strat_temporelles; d++) {
                    for (i = 0; i < X; i++) {
                        for (j = 0; j < Y; j++) {
                            for (k = 0; k < Dataset_EVOL.prof_potentielles.length; k++) {
                                strates[p][d][i][j][k] = 0;
                            }
                        }
                    }
                }
            }
    Donc je compare les préférences environnementales de chaque individu avec l'environnement en chaque point de cet espace en 4 dimensions, et si c'est bon, je met simplement un "1" , sinon je laisse un "0" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (env_ok) {
                                                strates[p][d][i][j][k]++;
    }

    Voila, donc je me demandait si il n'y avait pas une solution évidente avec d'autres fonctions java pour ce genre d'utilisations...

    La seule solution que je vois serais peut-etre de créer un tableau à 4 dimension pour chaque individu, mais ça doit revenir au même niveau mémoire, non?

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par timbrochier Voir le message
    J'ai une population avec "Population.Pop_rec.size()" individus (de l'ordre de 150 000 individus)
    Pour chaque individus, je veux enregistrer son habitat dans un environnement en 4 dimensions (date (365), longitude (~100), latitude(~100 , altitude (~25 )
    Initialement je déclare donc ce fameu tableau trop grand, puis l'idée est de le remplir de 0 :
    Donc je compare les préférences environnementales de chaque individu avec l'environnement en chaque point de cet espace en 4 dimensions, et si c'est bon, je met simplement un "1" , sinon je laisse un "0" :
    Donc en fait tu as un immense tableau rempli principalement de 0, avec juste un seul point "1" pour chaque individu...
    Ça fait beaucoup de mémoire prise par chaque individu (365*100*100*25 int) pour pas beaucoup d'information utile (4 int : date, latitude, longitude, altitude).
    En plus tu aurais au moins pu utiliser des booléens plutôt que des entiers...

    Tu gagnerais sans doute beaucoup à passer à un tableau à deux dimensions, de taille Population.Pop_rec.size()*4, dans lequelles tu stockerais directement les 4 infos qui t'intéressent : date, latitude, longitude, altitude. Tu ne perds aucune info mais tu divise la mémoire occupée par (365*100*100*25/4).
    Voire, histoire de faire un peu plus orienté objet, un tableau à une dimension, de taille Population.Pop_rec.size(), qui contient des instances d'une classe "Individu" contenant les 4 infos.
    Évidemment il va falloir ensuite que tu revoies le traitement que tu effectuais sur ton tableau... Mais ça ne doit pas être impossible, et le gain en mémoire est certain


    EDIT : croisement de posts avec adiGuba...
    L'idée la même : il faut revoir ton modèle de façon à stocker directement la valeur "date" au lieu de stocker un tableau de 365 cases dont une seule case est cochée, et idem pour les autres valeurs.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par timbrochier Voir le message
    Existe-t-il une solution alternative aux tableaux, moins couteuse en mémoire mais tout aussi rapide?
    Franchement, un tableau c'est ce qui est à la fois le moins coûteux en mémoire et le plus rapide. Toutes les autres collections ont besoin d'au moins la même mémoire qu'un tableau pour stocker les données, plus les informations de l'objet représentant la collection.
    À moins que tu n'utilises pas toutes les cases de tes tableaux. Dans ce cas l'utilisation de collections à taille dynamique (listes...) peut effectivement permettre un gain de mémoire (on ne réserve pas d'espace pour des "cases" de tableau qui ne seront jamais utilisées).
    Mais si vraiment tu as besoin de toutes les cases de ton tableau à 5 dimensions, je ne penses pas que tu puisses gagner de la mémoire en changeant de structure de données. Tu peux essayer de revoir ton algorithme (essayer de diviser le traitement, de travailler sur des sous-ensembles de données de façon à ne pas devoir toutes les charger en même temps) mais ce n'est peut-être pas possible, ça dépend de ce que fait ton programme...

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

Discussions similaires

  1. Tableau trop grand
    Par dannhil dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 14
    Dernier message: 20/10/2008, 02h36
  2. Tableau trop grand sur FF
    Par kevinf dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/06/2008, 20h16
  3. taille tableau trop grande
    Par zhao dans le forum C++
    Réponses: 12
    Dernier message: 26/03/2008, 15h59
  4. [VBA-W2007]scinder automatiquement un tableau trop grand
    Par tazamorte dans le forum VBA Word
    Réponses: 3
    Dernier message: 22/06/2007, 17h28
  5. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14

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