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

Format d'échange (XML, JSON...) Java Discussion :

Parsing XML file [SAX]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 23
    Par défaut Parsing XML file
    Ci-dessous mon code:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.DefaultHandler;
    import org.xml.sax.helpers.XMLReaderFactory;
     
     
    public class SAXFilterInFile {
      public static void main(String[] args) throws Exception {
     
        if (args.length != 1) {
          System.err.println("Usage: java SAXFilter XML_FileName.xml");
          System.exit(-1);
        }
     
        new SAXFilterInFile(args);
        System.gc();
      }
     
      public SAXFilterInFile(String[] args) throws SAXException, IOException {
        XMLReader parser = XMLReaderFactory.createXMLReader();
        // should load properties rather than hardcoding class name
        parser.setContentHandler(new PeopleHandler());
        parser.parse(args[0]);
      }
     
     
      class PeopleHandler extends DefaultHandler {
        boolean conceptui = false;
     
        boolean conceptname = false;
     
        public void startElement(String nsURI, String localName,
            String rawName, Attributes attributes) throws SAXException {
          // Consult rawName since we aren't using xmlns prefixes here.
          if (rawName.equalsIgnoreCase("conceptui"))
            conceptui = true;
          if (rawName.equalsIgnoreCase("conceptname"))
            conceptname = true;
        }
     
        public void characters(char[] ch, int start, int length) {
         try {
     
          BufferedWriter out = new BufferedWriter(new FileWriter("Testing1.txt",true));   
     
          if (conceptui) {
            out.write("ConceptUI: " + new String(ch, start, length) + " , ");
            System.gc();
            conceptui = false;
          } else if (conceptname) {
            out.write("ConceptName: " + new String(ch, start, length));
            out.newLine();
            System.gc();
            conceptname = false;
          }
           out.close();
         }
     
         catch (IOException e) {
     
                System.out.println("IOException:");
                e.printStackTrace();
     
                }
        }
      }
    }
    J'ai augmenté la memoire du JVM pour 512MO mais encore j'ai une erreur:
    OutOfMemory: Java Heap space

    J'ai forcé le Garbage Collector aussi la meme erreur, est-ce je lance bien le garbage collector dans mon code? Si non ou il faut le placer?

    Je parse un fichier xml de 450MO sur une machine ayant 1GO de memoire.

    Merci d'avance pour votre aide c'est assez urgent

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    D'apres ce que j'ai vu, il n'y a rien dans ton code qui bouffe vraiment de la memoire, a part SAX bien sur.

    Evite les appels explicites au GC, il se debrouille suffisamment bien tout seul.

    J'ai l'impression que SAX garde l'ensemble du fichier en memoire, ce qui est etonnant car pas vraiment necessaire dans une approche evenementielle comme SAX.

    J'ai jete un oeil dans la doc de SAX mais ils ont l'air de dire que meme de grands documents peuvent etre parses sans probleme.

    Tu nous a montre tout ton code, c'est sur ?

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Par défaut
    Salut,

    Non je confirme que SAX ne conserve pas en mémoire, c'est d'ailleurs ce qu'il fait qu'il se différencie de DOM.
    Si tu accorde 512m de mémoire, meme si tu utilise DOM, si le fichier en fait 420m tu n'aura pas de dépassement (512 - 420 > 0 ).
    Il doit surement y avoir un probleme ailleurs, si tu as encore du code montre nous le.
    Mais c'est vraiment étrange...

    EDIT: juste pour essayer, accorde 600m a la vm, le fichier fait 420m, la vm aura encore largement de mémoire pour elle, si tu as encore cette erreur c'est qu'il y a un probleme ailleurs.

    a+

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par Kh4iN3 Voir le message
    Salut,

    Non je confirme que SAX ne conserve pas en mémoire, c'est d'ailleurs ce qu'il fait qu'il se différencie de DOM.
    Si tu accorde 512m de mémoire, meme si tu utilise DOM, si le fichier en fait 420m tu n'aura pas de dépassement (512 - 420 > 0 ).
    Il doit surement y avoir un probleme ailleurs, si tu as encore du code montre nous le.
    Mais c'est vraiment étrange...

    EDIT: juste pour essayer, accorde 600m a la vm, le fichier fait 420m, la vm aura encore largement de mémoire pour elle, si tu as encore cette erreur c'est qu'il y a un probleme ailleurs.

    a+
    Je suis pas tout a fait d'accord avec toi pour le coup de DOM et des 420, DOM garde l'ensemble des donnees parsees en memoire donc 420Mo minimum. A ca il faut rajouter la structure objet qui 'decore' toutes ces donnees: les Nodes et la a mon avis on est large au dessus des 420 et 512 me parait meme carrement etroit.

    Mais SAX ne devrait pas bouffer la memoire comme ca et comme dans le code qu'on a vu les elements sont ecrit dans un fichier et basta .. ya pas de raison non plus pour ce code de planter.

    Question subsidiaire: quelle est la taille en gros du texte que tu essayes d'ecrire dans characters(...) ?

    Par contre je tiens a te signaler un probleme potentiel: characters ne te retourne pas forcement tout le texte a l'interieur d'un element en une fois. Je sais bien que tu ecris en append dans ton fichier mais tu fais un reset de tes conditionnelles aussi.
    Le reset devrait etre fait dans le endElement pour que ce soit correct.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

    Citation Envoyé par bulbo Voir le message
    Evite les appels explicites au GC, il se debrouille suffisamment bien tout seul.
    +1
    Et les appels explicites aux GC peuvent te plomber les perfs...

    Citation Envoyé par bulbo Voir le message
    A ca il faut rajouter la structure objet qui 'decore' toutes ces donnees: les Nodes et la a mon avis on est large au dessus des 420 et 512 me parait meme carrement etroit.
    Sans oublier que les char sont codé sur 2 octets en Java...

    Citation Envoyé par bulbo Voir le message
    Mais SAX ne devrait pas bouffer la memoire comme ca et comme dans le code qu'on a vu les elements sont ecrit dans un fichier et basta .. ya pas de raison non plus pour ce code de planter.
    +1
    Je viens de tester ce code avec un fichier de plus de 600 Mo qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xml>
    <conceptui>01</conceptui><conceptname>01</conceptname>
    <conceptui>01</conceptui><conceptname>01</conceptname>
    <conceptui>01</conceptui><conceptname>01</conceptname>
    ...
    Et j'ai utilisé JConsole pour le surveiller et je ne dépasse pas les 2Mo d'utilisation... (note : j'ai viré tous les System.gc() car sinon le programme moulinait tellement que j'arrivais même pas à m'y connecter avec JConsole).






    Sinon perso ce qui me gène c'est que tu réouvres à chaque fois le même fichier à chaque appel de la méthode characters()

    Ce serait surement mieux d'utiliser openDocument() pour ouvrir le fichier et de le fermer dans endDocument() (et d'utiliser finalize() comme garde-fou).


    Sinon tu peux faire une toute petite optimisation sur les write pour éviter la création d'une chaine temporaire en évitant d'utiliser l'opérateur + :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out.write("ConceptUI: " + new String(ch, start, length) + " , ");
    deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    out.write("ConceptUI: ");
    out.write(new String(ch, start, length));
    out.write(" , ");
    a++

  6. #6
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    adiGuba > Pour le coup des write je ne suis pas sur. A mon avis une concatenation logicielle est meilleure en performance que plusieurs ecritures sur le disque. Quoique dans le code que tu montres y a t'il une ecriture de faite pour chaque write ou est-ce que ca attends un \n ou un appel a flush pour faire l'ecriture ?

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

Discussions similaires

  1. parsing xml en francais
    Par ouioui2000 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/10/2005, 17h03
  2. [JSP] Parsing XML avec JDOM
    Par benben13 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 26/08/2005, 17h19
  3. [Quartz][Tomcat] Jobs.xml file not found exception
    Par Arnaud Giuliani dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 05/08/2005, 09h20
  4. The XML file cannot be displayed
    Par UVCR dans le forum XMLRAD
    Réponses: 2
    Dernier message: 08/03/2005, 16h26
  5. Xml file system storage
    Par sebA dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 30/09/2004, 07h49

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