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 :

Gérer des objects de grande taille


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 25
    Par défaut Gérer des objects de grande taille
    Bonjour à tous,

    Je programme des algorithmes d'optimisation en Java, dernièrement je fesais un test et là, au bout de 500 000 itérations, le programme commence à ralentir, les itérations s'arrêtes puis reprennent ! ensuite le programme génère l'erreur "java.lang.OutOfMemoryError: GC overhead limit exceeded". En faisant appel à Google, j'ai compris que cela peut provenir des objets qui ont une grande taille, et en effet, dans mon algo, et à chaque itération, j'ajoute un object à une liste, donc la taille de la liste correspond au nombre d'itérations. Je pense qu'à priori ça vient de là ! mais je n'en suis pas sur ! donc si vous avez une idée sur la manière de résoudre ce problème je serais reconnaissant! et sinon y'a t-il une manière de voir l'évolution de la mémoire heap en temps réél, et objet par objet !

    merci,

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Si tu travailles avec des listes contenant x centaines de milliers d'éléments, effectivement, cela peut-être la cause de ton erreur...

    Pour pouvoir t'aider à améliorer cela, il faudrait par contre que l'on puisse voir à quoi ressemble le code correspondant, parce que là, sans rien, ça va pas être évident...

    Mako.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 25
    Par défaut
    Citation Envoyé par Mako 5013 Voir le message
    Bonjour,

    Si tu travailles avec des listes contenant x centaines de milliers d'éléments, effectivement, cela peut être la cause de ton erreur...

    Pour pouvoir t'aider à améliorer cela, il faudrait par contre que l'on puisse voir à quoi ressemble le code correspondant, parce que là, sans rien, ça va pas être évident...

    Mako.
    sa va être dur d'envoyer le code en entier surtout que j'utilise plusieurs classe mais je peux décrire la structure du programme principal. En effet, c'est un algorithme de branch an bound, l'object qui est stocké dans la liste modélise "l'espace de recherche", qui sera divisé à chaque itération et stocké dans cette fameuse liste. C'est cette structure qui permet de remplir la liste !

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Un point qui peut améliorer les performance consiste à allouer à ta liste directement l'espace qui sera utilisé. Ça évite notamment des recopies d'arrays, quand tu dépasses la taille "max" actuelle de ta liste.
    Mais bon, le mieux serait d'avoir le code ^^

  5. #5
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Quel type de list utilises tu ?
    Je pense que dans ton cas, il vaux mieux opérer sur une structure de données de type arbre avec tous les avantage que cela implique. Tes itérations vont se trouver vachement réduites!! C'est une idée!
    Pour des recherches d'information, utilise les arbres de recherche et pourquoi pas des AVL.
    J'ai testé tout ce monde et c'est super efficace!
    Pourquoi, ne pas faire appel également à une base de donnée?

    Choisir une liste comme structure de données dans ton cas me parait très osé honnêtement.
    Cordialement

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 25
    Par défaut
    Citation Envoyé par wafiwafi Voir le message
    Quel type de list utilises tu ?
    Je pense que dans ton cas, il vaux mieux opérer sur une structure de données de type arbre avec tous les avantage que cela implique. Tes itérations vont se trouver vachement réduites!! C'est une idée!
    Pour des recherches d'information, utilise les arbres de recherche et pourquoi pas des AVL.
    J'ai testé tout ce monde et c'est super efficace!
    Pourquoi, ne pas faire appel également à une base de donnée?

    Choisir une liste comme structure de données dans ton cas me parait très osé honnêtement.
    Cordialement
    En fait j'utilise une structure arbre (que j'appelle PriorityQueue, mais cela revient au final à une ArrayList) Concernant les bases de données, en quoi cela consiste exactement ? (je ne suis pas informaticien à la base !)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Par défaut
    Citation Envoyé par issmaz Voir le message
    Je programme des algorithmes d'optimisation en Java
    Citation Envoyé par issmaz Voir le message
    c'est un algorithme de branch an bound
    C'est un domaine dans le quel il existe déjà beaucoup de librairies (lp_solve, CPLEX*, Mosek*...). Es-tu sur de ne pas ré-implémenter du code déjà super bien écrit?

    * Ces librairies sont payantes.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 25
    Par défaut
    Citation Envoyé par LGnord Voir le message
    C'est un domaine dans le quel il existe déjà beaucoup de librairies (lp_solve, CPLEX*, Mosek*...). Es-tu sur de ne pas ré-implémenter du code déjà super bien écrit?

    * Ces librairies sont payantes.
    ces librairies sont des librairies d'optimisation c vrai, mais les problèmes que je traite ne sont pas linéaires, ni quadratiques... donc ces solveurs me sont inutiles, d'où la nécessité d'implémenter mes propres algos !

  9. #9
    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
    Deux situations possibles : soit tu es sûr que la taille mémoire utilisée ne peut pas être diminuée, soit tu réfléchis à améliorer ton algo sur la gestion mémoire.

    Dans ces deux cas, tu peux imaginer augmenter la RAM allouée à la JVM (documente-toi sur l'option -Xmx de ma JVM), passer par des fichiers intermédiaires pour un stockage temporaire le temps de terminer le calcul...
    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.

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Si tu fais du Branch and Bound c'est que tu as un système de contraintes permettant de couper les branches...

    Dès lors que tu as des contraintes et un problème discret, tu peux utiliser un Solver de Programmation par contraintes à cet effet.

    Genre http://www.emn.fr/z-info/choco-solver/...

    Sinon il va te falloir trouver un moyen de limiter les branches explorées au plus vite ((Méta)heuristique quelconque), ou du moins limiter les données stockées à la meilleure solution courante...

    Tu stocke bien trop d'infos en mémoire pour que ce soit viable...
    Par contre tu pourrais imaginer une sorte de cache au niveau du disque, par contre tu vas perdre en performance, forcément....

  11. #11
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par issmaz Voir le message
    et sinon y'a t-il une manière de voir l'évolution de la mémoire heap en temps réél, et objet par objet !
    Tu peux toujours faire de la vérification avec des outils comme JProfiler mais si tu veux attendre tes 500 000 itérations, tu n'es pas rendu

    Le plus simple comme le dit Mako 5013, précise nous ton code et le contexte. Car peut être que pour ce que tu fais, tu n'as pas besoin de tout créer.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

Discussions similaires

  1. Upload des fichiers de grandes tailles
    Par zdig10 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 13/07/2010, 14h11
  2. Créer et remplir des matrices de grandes tailles
    Par Haytham_aziz dans le forum Fortran
    Réponses: 5
    Dernier message: 30/05/2010, 17h34
  3. Envoyer des fichiers de grande taille
    Par ralf91 dans le forum Windows Communication Foundation
    Réponses: 9
    Dernier message: 20/02/2010, 18h04
  4. Réponses: 5
    Dernier message: 18/05/2009, 16h32
  5. Réponses: 6
    Dernier message: 19/10/2004, 13h46

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