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 :

Gestion de la mémoire


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut Gestion de la mémoire
    Bonjour,

    J'ai dans mon application une Classe Poule
    j'ai créé 17000 poules dans ma ferme (Classe ferme) . Je lance 1 millions de simulations.
    Pour toutes mes simulations
    Pour chaque poule de ma ferme
    Je calcule le nombre d'œuf qu'elle a pondu à la simulation courante
    je stocke dans une arraylist propre à chaque poule la liste du nb d'oeuf qu'ele a pondu .
    Fin premier pour
    Puis je somme l'ensemble du nombre d'oeuf par simulation dans une autre arraylist

    Lorsque je met en commentaire la partie souligne : pas de problème
    Lorsque cette partie n'est pas commenté : problème (outofmemoryerror java head swap)

    Solution: Après quelques recherches sur google j'ai rajouté à la jvm
    -Xms1024m -Xmx1024m
    cela ne règle toujours pas le problème. Que faire ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Un peu de code ne serait pas superflu...

    Pour cette partie :

    Je calcule le nombre d'œuf qu'elle a pondu à la simulation courante
    je stocke dans une arraylist propre à chaque poule la liste du nb d'oeuf qu'ele a pondu .
    Tu as besoin de quoi à la fin de la simulation ?
    • Le nombre d'oeufs pondus à chaque simulation ? Si c'est le cas, je vois pas comment faire mieux, faudrait voir ton code.
    • Le nombre total d'oeufs ? Si c'est le cas, pas d'arraylist, mais somme directe des oeufs
    • La moyenne des oeufs ? Si c'est le cas, stocke le total d'oeufs et garde en mémoire le nombre de simulations effectués et fait une division à la fin.
    • Sinon, de quoi tu as besoin ?


    Sinon, est-ce que tu asbesoin de toutes les données à la fin de la simulation ? Est-ce que tu ne pourrais pas ressortir des données intermédiaires durant la simulation ? Ou alors calculer des données intermédiaires, par exemple toutes les 10'000 simulations, tu fais des moyennes ou je ne sais quoi d'autres et enfin, à la fin de la simulation, tu affiches les résultats pondérés par 10'000 simulations, tu auras beaucoup moins de données en mémoire.

    Ou sinon, tu stockes les informations dans un fichier ou une base de données et à la fin tu relis les informations dans le fichier ou la base de données pour générer tes informations nécessaires. Mais ça va bien entendu diminuer les performances de ta simulation.

    Mais effectivement, si pour chacune des 17'000 poules, tu as 1'000'000 de simulations, ca te fait quand même 17'000'000'000 de nombres entiers à stocker. Tu peux faire le calcul avec un int sur 32 bits sur ce qui est nécessaire, ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    j'ai besoin de :

    -nombre d'oeufs par poule pour chaque simulation (stockage dans une ArrayList)
    -nombre total d'oeufs par simulation (ArrayList d'1 millions ou un total = somme de tous les oeufs pondus durant la simulation)

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    While(i < nbSimulation){
    for(Poule poule_courante : poules.values()){
         nboeuf = r.nextDouble()  // r = random() et double car je laisse 3.5 oeufs (pas de logique mais pas le problème ici)
          poule_courante.ajouterOeuf(nboeuf);
          totalOeuf += nboeuf;
    }
    ferme.ajouterOeufs(totalOeuf);
    totalOeuf = 0;
    i++;
     }
    }
    Voilà ! MErci d'avance

  4. #4
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Si tu as vraiment besoin de tout ça, tu seras obligé de trouver un support statique pour stocker tes données temporairement, car tu pourras pas tout faire tenir en RAM...

    Sinon, tu en fais quoi à la fin de tes informations ? Tu les affiches simplement ? Tu fais des moyennes ?

    Si tu les affiches (j'en doute car afficher 1'000'000 d'informations c'est pas terrible ), tu peux le faire à chaque étape au lieu de le faire à la fin. Mais si tu les affiches dans une interface graphique par exemple, tu auras le même problème de place mémoire et tu seras quand même obligé de passer par un autre format de stockage.

    Si tu fais des moyennes, le mieux est de faire des sous moyennes par poule. Par exemple, toutes les milles simulations, tu calcules la moyenne courante et tu la stocke dans un ArrayList et tu vides la ArrayList des oeufs.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    j'ai besoin de toutes les valeurs et non les moyennes, je vais tester avec une base de données... merci

    J'ai besoin de ces infos pour savoir quelle type de poule pond le mieux, quelle couleur etc...

    Sinon, n'y a t'il pas moyen d'utiliser le disque dur au lieu de la RAM ?

  6. #6
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Bien sûr que c'est possible, mais il faut faire toi-même l'écriture dans un fichier. Tu ne peux pas directement créer des Integer qui seront dans des fichiers.

  7. #7
    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
    Citation Envoyé par bruno_nono Voir le message
    j'ai créé 17000 poules dans ma ferme (Classe ferme) . Je lance 1 millions de simulations.
    Pour toutes mes simulations
    je stocke dans une arraylist propre à chaque poule la liste du nb d'oeuf qu'ele a pondu .
    Allez sort ta petite calculette avant de pondre des machins pareils:

    17000 arraylist de 1 millions d'entrées. Chaque entrée étant de type Byte (au minimum), elle occupera 4+1 octet au minimum (référence au type Byte de classe + payload de 1 byte) = 79G
    Si on supprime les objet et qu'on ne garde que des bytes (donc une poule ne fait pas plus de 127 oeufs et on stock dans un array directement), on descend péniblement à 15G (sans compter le reste des données)....


    Bref, ton besion, c'est ni'mporte nawak


    Quel besoin as-tu de savoir que dans la 756891 simulation, la poule 16209 a pondu 4 oeufs??? Ton but est de sortir des stats de ta simulation -> fait ton calcul synthétique au fur et à mesure que tu progresse dans la simulation!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    le besoin est là pourtant! J'ai juste métamorphosé mon problème avec une ferme et des poules. Mais en gros je dois absolument stocker pour chacune de mes poules toutes ces valeurs... je vais opter pour une utilisation de jexcel ou je pourrais directement aller chercher une valeur...

  9. #9
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Citation Envoyé par bruno_nono Voir le message
    le besoin est là pourtant! J'ai juste métamorphosé mon problème avec une ferme et des poules. Mais en gros je dois absolument stocker pour chacune de mes poules toutes ces valeurs... je vais opter pour une utilisation de jexcel ou je pourrais directement aller chercher une valeur...
    comme tu veux tant que tu ne stoque pas tous en ram ca devrai passer

  10. #10
    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
    Citation Envoyé par bruno_nono Voir le message
    je vais opter pour une utilisation de jexcel ou je pourrais directement aller chercher une valeur...
    Bon allez, on active ses neurones s'il vous plaît. vous avez deux problèmes

    1) vos contraintes, aussi curieuses qu'elles soient, nécessitent une occupation mémoire monstrueuse
    2) Si on veux un stockage sur disque, vous allez avoir des gros problèmes de perfs pour faire vos calculs.

    Et vous allez donc jeter, sans même avoir regardé, dans tout ce truc, une api supplémentaire, qui n'a mais "rien" à voir avec le problème initial et dont vous n'avez même pas mesuré les capacité.

    Indice numéro 1: les fichiers excel ne supportent pas plus de 256 colonnes (elles vont où les 17.000 poules?)
    Indice numéro 2: jexcel va "lire" le fichier en mémoire. La seule différence c'est que maintenant vous aurez besoin d'une dixaine de fois plus de mémoire, c'est balot.


    Pas de miracle, pour une telle quantité de données, un fichier plat et essayer de travailler avec les api io de java les plus performantes possible, en limitant les aller-retour au maximum. (Mais je reste sur ma position qu'on peux calculer toutes ces statistiques au fur et à mesure....)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    (Mais je reste sur ma position qu'on peux calculer toutes ces statistiques au fur et à mesure....)
    La métaphore que j'ai pris montre en effet que l'on a pas besoin du nombre d'oeufs pondues par la simulation xde la poule i...

    imagine... un circuit de formule 1, il y a x tours avec y voitures de courses.

    Je stocke à chaque tour pour chaque voiture son temps de circuit et pour chaque tour le temps de circuit de l'ensemble des voitures.

    Le besoin étant, si je veux savoir pourquoi un tour paraît plus long que les autres, je vais étudier individuellement les temps. Et là je vais aller au tour i pour regarder le temps de chaque voiture... savoir si c'est une voiture qui a été très longue ou toutes les voitures plus longues (par exemple, si au tour i il a plu...) à partir de ce principe il y a plein de choses intéressantes que l'on peut en déduire. Désolé de ne pouvoir être plu concret, en faite, j'ai peur d'utiliser un fichier plat car je ne peux pas accéder directement à la donnée souhaitée (si je veux voir juste la simulation i) je dois lire tout le fichier jusqu'à la ièmee ligne

  12. #12
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Citation Envoyé par bruno_nono Voir le message
    Le besoin étant, si je veux savoir pourquoi un tour paraît plus long que les autres, je vais étudier individuellement les temps. Et là je vais aller au tour i pour regarder le temps de chaque voiture... savoir si c'est une voiture qui a été très longue ou toutes les voitures plus longues (par exemple, si au tour i il a plu...) à partir de ce principe il y a plein de choses intéressantes que l'on peut en déduire. Désolé de ne pouvoir être plu concret, en faite, j'ai peur d'utiliser un fichier plat car je ne peux pas accéder directement à la donnée souhaitée (si je veux voir juste la simulation i) je dois lire tout le fichier...
    Passe en base mais ca sera plus lourd (gestion de la base oblige)

  13. #13
    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
    Citation Envoyé par bruno_nono Voir le message
    j'ai peur d'utiliser un fichier plat car je ne peux pas accéder directement à la donnée souhaitée (si je veux voir juste la simulation i) je dois lire tout le fichier jusqu'à la ièmee ligne
    Où t'as vu ça, on peux accéder où on veut dans un fichier sans lire le reste, choisi juste correctement tes api dans java.io!

    Je rajoute qu'on a pas besoin de tout stocker pour ensuite faire de l'analyse au cas par cas (de toutes façons tu prendra des cas bien précis dans une série de plusieurs millions??), il suffit que les paramètres de la simulation soit connus pour la rendre reproductible à souhait.... Question de choix.

  14. #14
    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
    je rajoute que si on prend un SATA 3G à plein débit (donc théorique), ta vitesse de relecture des données sera 3 à 4 minutes pour lires 79G de données.....

    Pour accéder comme à de la mémoire à un disque en java, on peut utiliser les byte buffer et assimilés

    http://gfx.developpez.com/tutoriel/java/nio/#LIV

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    Ok thanks

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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