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

Spring Java Discussion :

Out Of Memory sur fichier XML 1Go


Sujet :

Spring Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Out Of Memory sur fichier XML 1Go
    Bonjour à tous,

    j'ai un batch qui prend 1 à n fichiers (40 maximum) XML en entrée. Lorsque le fichier est > 800Mo, j'obtiens "java.lang.OutOfMemoryError: Java heap space". Sur le serveur de bench ou le batch tourne, le lanceur du batch a été modifié pour prendre en compte 2Go de mémoire. Mais ça ne passe toujours pas.

    Le reader est de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <bean id="multiResourceReader" class=" org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
    		<property name="resources" value="#{jobParameters['inputResource']}" />
    	 	<property name="delegate" ref="pivotItemReader" />
        </bean>
    	<bean id="pivotItemReader" class="org.springframework.batch.item.xml.StaxEventItemReader">
        	<property name="fragmentRootElementName" value="Diffusion" />
        	<property name="unmarshaller" ref="diffusionmarshaller" />
    	</bean>
    Comment gérer ces gros fichiers XML sans pour autant casser tout le code Java derrière ?

    Précision qui a son importance : je débute sur Spring Batch, ce premier composant a été ma formation...

    Merci pour votre aide où piste que vous pourrez m'apporter.

    Cdlt,

  2. #2
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Bonjour,
    Est-ce que votre fichier ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <rootElement>
      <diffusion>
        ...
      </diffusion>
      <diffusion>
        ...
      </diffusion>
    </rootElement>
    Ou à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <diffusion>
      <element>
        ...
      </element>
      <element>
        ...
      </element>
    </diffusion>
    Je reprends l'exemple de Mkyong publié à cette adresse. Notez qu'il défini le fragmentRootElement au niveau "record" et non au niveau "company". Si la configuration du fragmentRootElement avait été "company", Spring Batch aurait chargé un seul élément contenant la totalité du fichier XML.

    Pourriez-vous déjà vérifier ce point ?
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 107
    Points : 89
    Points
    89
    Par défaut
    @Lordsephiroth, en définissant le fragmentRootElement au niveau "record", est-ce que la totalité du fichier est lu puis splitté ou bien cela se fait au file du fichier ?

  4. #4
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Dans l'exemple de Mkyong, en plaçant le fragmentRootElement au niveau du record, les éléments devraient être lus par lots (de la taille du commit-interval) et ne devraient pas tous être en même temps en mémoire. Dans ce cas, le reader devrait retourner une List<Record>, le(s) processeur(s) devraient s'appliquer sur un objet de type Record.

    À l'inverse, si on place le fragmentRootElement au niveau "company", le reader devrait retourner une List<Company>. Comme le XML ne contient qu'un seul élément "company", cette liste ne devrait contenir qu'un seul et unique objet (qui contient donc tous le fichier, dont une très longue List<Record>).

    Donc pour répondre à la question, en plaçant au niveau record, le reader devrait normalement lire le fichier séquentiellement, lots par lots (en gardant un pointeur interne sur l'emplacement courant du prochain élément à lire), et ne pas lire le fichier entier avant de faire un split.
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 107
    Points : 89
    Points
    89
    Par défaut
    Parfait @Lordsephiroth, merci pour tes explications !

Discussions similaires

  1. Requête sur fichier XML
    Par migutz dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/11/2007, 15h34
  2. [XML] Quizz basé sur fichier XML
    Par Heilong dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/10/2007, 14h16
  3. Erreur "Out Of Memory" sur application en VB4
    Par aokiseiichiro dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/07/2007, 17h37
  4. [AJAX] requête sur fichier.xml => erreur 405 sous IE !
    Par jeje13009 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 26/03/2007, 21h42
  5. Out of memory sur un appel de smtpsend
    Par frangin2003 dans le forum Modules
    Réponses: 1
    Dernier message: 01/06/2006, 14h16

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