locked
performance en c++ avec XML RRS feed

  • Question

  • Je dois scruter un gros fichier XML (plusieurs millions d'items), et j'ai un problème de performance.
    Je travaille sur un Pentium IV / 3 Ghz.

    Je scrute tous les nœuds du fichier avec le code qui suit :
    ==============================================
    #import        "msxml4.dll"
    using namespace MSXML2;

    ...

    BSTR BSTR_Result;
    IXMLDOMNodePtr pNode;

    // scan tree of nodes
    while( pNode != NULL)
    {
    // get the text of the node
    pNode->get_text( &BSTR_Result); // < need 9 milliseconds

    pNode = pNode->nextSibling;      // very quick (0 ms)
    }

    ==============================================
    Alors que les appels à nextSibling ont un temps d'éxécution négligeable, l' appel à get_text dure 9 millisecondes.

    D'où vient le problème, et comment le résoudre.

    Merci.

    mercredi 8 octobre 2008 14:52

Toutes les réponses

  • Utilisez-vous SAX ou DOM ?

     

    Pour les gros fichiers SAX est recommandé.

     

    http://support.microsoft.com/kb/276505/fr

    jeudi 9 octobre 2008 08:46
  • Bonjour.

    Je suppose que j'utilise DOM :

    > #import        "msxml4.dll"
    > using namespace MSXML2;

    Mon objet noeud est :
    > typedef    IXMLDOMNodePtr        XMLNode;

    Mon objet Document est :
    > typedef    IXMLDOMDocument2Ptr    XMLDoc;

    J'ai expérimenté l'accès à un gros fichier XML en DotNet et les performances sont très satisfaisantes.
    Mais en Visual 6 / C++, le mécanisme que j'ai utilisé ne l'est pas (cf mail précédent).

    En quelques mots, quelles sont les différences entre l'interface DOM et l'interface SAX ?

    Cordialement,


    jeudi 9 octobre 2008 11:13
  • La philosophie de DOM est de charger tout le fichier XML en mémoire, dans faire une arborescence d'objet avec énormément de fonctionnalité.

    La philosophie de SAX est de lire le fichier au fil de l'eau et d'appelé des fonctions de rappel à chaque étape de la lecture du document.

    DOM est donc très riche et facile à utiliser car les objets ont beaucoup de méthodes. Dans SAX, les performances est le maître mot et il y a peu de fonctionnalité intégré et la lecture est en forward only.

     

    C'est donc 2 vues radicalement opposées de la lecture et de la manipulation des documents XML.

    Le lien de mon précédent poste pointe vers un projet d'extension de VC++6 qui fournit un wizard pour la création d'application utilisant SAX ainsi que son utilisation pour la création d'une application d'exemple.

    http://support.microsoft.com/kb/276505/fr

     

    jeudi 9 octobre 2008 14:45
  • Merci pour cette présentation.

    Néanmoins, je ne comprends toujours pas pourquoi une simple instruction comme la suivante dure 9 millisecondes, alors qu'on pointe sur le noeud.

    BSTR BSTR_Result;
    IXMLDOMNodePtr pNode;

    // get the text of the node
    pNode->get_text( &BSTR_Result);


    Cordialement.
    vendredi 10 octobre 2008 08:19
  • Vu la richesse du modèle DOM, je ne ferais pas d'assertion sur l'implémentation de celui-ci.

    Si votre algorithme n'a besoin que d'une lecture forward only du fichier, SAX sera toujours préférable à DOM.

     

    vendredi 10 octobre 2008 09:22