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

Persistance des données Java Discussion :

JAXB XML: Marchalling vers fichier plus rapide qu'en mémoire(DOM)? Pourquoi?


Sujet :

Persistance des données Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 31
    Points
    31
    Par défaut JAXB XML: Marchalling vers fichier plus rapide qu'en mémoire(DOM)? Pourquoi?
    Bonjour,

    nous avons un petit problème de performance lors du marschaling avec JAXB.

    Lorsque nous le faisons vers un fichier, le marchalling se fait en 3 secondes pour un document de 5 megas envirron. (Fichier avec buffer... donc optimisé).

    Par contre, lorsque nous le faisons en mémoire (DOM), il est de 15 secondes!

    Cela nous semble très bizarre... Nous soupconnons donc que nous ne devons pas bien optimiser l'appel du marchaller.

    Voici le bout de code qui pose problème.
    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
      try { 
       //Create a JAXBContext instance
       JAXBContext tJaxbContext = JAXBContext.newInstance(pJaxPropertiesFile);
       Marshaller tMarshaller = tJaxbContext.createMarshaller();
     
       tMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
    
        FileOutputStream fos = new FileOutputStream("d:/temp/fichier_marshalle.xml", false /* append */ );
        BufferedOutputStream bos = new BufferedOutputStream( fos, 4096 /* buffsize */ );
        DataOutputStream dos = new DataOutputStream( bos );
        OutputStream os = dos;
        tMarshaller.marshal( pObject, os );
        //3 secondes pour l'execution
        dos.flush();
        dos.close();
     
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(false);
      dbf.setValidating(false);
      DocumentBuilder db;
      Document doc = null;
       db = dbf.newDocumentBuilder();
       doc = db.newDocument();
       // Generation du flux XML sortant
       tMarshaller.marshal(pObject, doc);
       //15 secondes pour l'execution
      
      } catch (ParserConfigurationException e) {   
       throw (e);
      } catch (Exception e) {
       throw (e);
      }
    Merci pour votre aide.

    Stéphane

  2. #2
    Membre habitué Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    La différence de performance s'explique (en partie) par le nombre d'objets java à créer : pour chaque élément JAXB il faut créer le noeud DOM (qui est un objet java) correspondant. En revanche l'écriture dans un fichier est moins gourmande car ton stream est "bufferrisé".

    Pour une explication plus détaillée, il faut se pencher sur l'implémentation du DOM que tu utilises. Regarde les opérations qui sont effectuées lorsque tu créé un noeud et que tu l'ajoute à la liste des fils d'un noeud parent (il doit certainement y avoir la mise à jour d'un index d'éléments pour la recherche par id, la construction de liens entre les noeuds, etc.)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    merci pour la réponse...

    Comment puis je générer un "Node" que je voudrais passer en paramètre dans un WebService (Soap) le plus rapidement?

    Je but de l'exercice étant de créer un Node plus rapidement en mémoire que lors d'une écriture sur disque...

    Merci pour votre aide.

    Stéphane

Discussions similaires

  1. XML XSL vers fichier.cvs
    Par yayabon dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 05/05/2012, 10h05
  2. Réponses: 14
    Dernier message: 11/07/2011, 10h14
  3. Réponses: 3
    Dernier message: 11/02/2008, 18h46
  4. Lire un fichier le plus rapidement possible
    Par Rodrigue dans le forum SL & STL
    Réponses: 9
    Dernier message: 02/05/2006, 10h43
  5. Réponses: 18
    Dernier message: 09/08/2005, 12h57

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