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 :

Comment éviter un out of memory ?


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut Comment éviter un out of memory ?
    Je traite un fichier texte très volumineux (plusieurs centaines de méga octets) et je tombe sur un out of memory.

    Pourtant il s'agit d'un batch qui ne garde pas de référence sur les String créées lors de la lecture du fichier :
    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
     
    BufferedReader input = new BufferedReader(new FileReader(file));
     
    try {
    	int count = 1;
    	String line = input.readLine();
    	while (line != null) {
    		traitement(line, count++);
    		line = input.readLine();
     
    		if (count % 100 == 0)  {
    			System.gc();
    		}
    	}
    }
    finally {
    	input.close();
    }
    Je ne comprends pas pourquoi le GC ne détruit pas les String régulièrement puisqu'elles ne sont plus référencées.

    J'ai rajouté System.gc() en espérant que cela améliorerait la situation, mais cela ne fait que retarder le plantage sans l'empêcher

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,

    Et traitement il fait quoi?

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    C'est du au fait de l'utilisation du String qui est immuable dans une boucle. Utilise plutôt un StringBuilder.

    A+.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    @ludomacho : Mon traitement fait simplement une insertion en base de données.

    @andry.aime : input.readLine() me retourne une String et je ne fait aucune opération sur cette String.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 639
    Points
    639
    Par défaut
    Bonjour,

    Comment est-ce que tu fais ton insertion ? Tu peux nous montrer le code correspondant ?

    Si tu passes par Hibernate (ou un autre ORM du même genre), il faut penser à flusher (session.flush()) et à vider (session.clear()) la session régulièrement.

    Romain.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Je n'ai pas le code sous la main, je suis sur un autre poste de travail, mais je n'utilise pas Hibernate. J'utilise uniquement l'api standard avec du code sql brut.

    Je fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String sql = "insert into table (`line`) values (?)";
    Connection conn = DriverManager.getConnection(...);
    PreparedStatement stmt = conn.prepareStatement(sql);
    stmt.setString(1, line);
    stmt.execute();
    C'est vraiment tout bête. Par contre, cela me fais penser que je ne fais pas de close() sur le statement en fin de traitement. Je vais essayer ce soir.

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par verbose Voir le message
    J'ai rajouté System.gc() en espérant que cela améliorerait la situation, mais cela ne fait que retarder le plantage sans l'empêcher
    System.gc() est à proscrire !
    Au mieux il ne fera rien... sinon il ne fera que de te pourrir les performances...


    Avant de remonter un OutOfMemory, le GC fera tout son possible pour libérer tout ce qu'il peut...


    Citation Envoyé par verbose Voir le message
    C'est vraiment tout bête. Par contre, cela me fais penser que je ne fais pas de close() sur le statement en fin de traitement. Je vais essayer ce soir.
    Il y a de forte chance que tu ai trouvé ton problème...


    a++

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Merci adiGuba. Je vous tiens au courant ce soir.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Je n'ai pas fini de traiter mon fichier, mais apparemment c'est bon

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

Discussions similaires

  1. Comment éviter un "Fatal error: Allowed memory size"
    Par pelloq1 dans le forum Langage
    Réponses: 2
    Dernier message: 19/07/2010, 13h56
  2. Optimiser un code pour éviter " out of memory"
    Par risack dans le forum MATLAB
    Réponses: 16
    Dernier message: 19/03/2007, 09h36
  3. Réponses: 4
    Dernier message: 28/07/2004, 10h42
  4. [eclipse 2.1][compilation] Comment éviter...
    Par ftrifiro dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 16h16
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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