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

XML Discussion :

[libxml2] Très grandes chaînes de caractères


Sujet :

XML

  1. #1
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut [libxml2] Très grandes chaînes de caractères
    Bonsoir,

    je viens ici demander conseil car je suis confronté à un problème de "taille" avec libxml2 SAX en C.

    J 'ai besoin de parser des fichiers xml de données 3D volumineux (>20 M) dont le contenu se trouve à 90% entre les balises (data). Je dois donc récupérer plusieurs chaines composées de dizaines voire de centaines de milliers de caractères, hors libxml limite à 4000 caractères la taille de la chaine récupérée dans la fonction de rappel. Afin éviter les attaques DOS d'après ce que j'ai compris (?!)

    Faut -il procéder en plusieurs appels consécutifs pour reconstituer la totalité de chaque chaîne ?

    En espérant que vous puissiez me répondre, merci d'avance .

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Faut -il procéder en plusieurs appels consécutifs pour reconstituer la totalité de chaque chaîne ?
    Ton characters callback sera appelé plusieurs fois de suite. Tu seras donc probablement amené à maintenir un buffer le temps d'entrer dans un EndElement.

  3. #3
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    La fonction characters() "sait" que la chaine est plus grande que 4000 caractères et se lance plusieurs fois a la suite avant le traitement de endElement, c'est ca ?

    Et je dois mettre a jour le buffer dans le corps de characters() ?

  4. #4
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    La fonction characters() "sait" que la chaine est plus grande que 4000 caractères et se lance plusieurs fois a la suite avant le traitement de endElement, c'est ca ?

    Et je dois mettre a jour le buffer dans le corps de characters() ?
    Il n'y a que lors d'un changement d'état que tu peux "savoir" que le traitement précédent est terminé (pour des callbacks non atomics comme characters()) [1]. Donc si tu remplis un buffer lors des appels à characters() en ajoutant à chaque fois la chaîne qui est passée, il faudra qu'à un moment tu arrètes de remplir ce buffer. Probablement que c'est dans le endElement suivant que tu sauras au plus tôt que tout le text t'a été passé.

    [1] Je n'ai jamais trop fais gaffe à cette limite de 4000 chars. Si tu es assuré que dans ta config c'est 4000 chars max qui sont passés à chaque fois (et jamais moins dans le cas où il y a plusieurs appels, sauf pour le dernier), alors un test sur le paramêtre du length pourrait t'indiquer si tu dois bufferiser ou non. Le pointer sur user_context qui t'est passé peut te servir à maintenir un état logique sur tes manips de buffering.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problèmes avec des fichiers 3D (COLLADA) trop gros !
    Bonjour,

    je travaille actuellement sur un viewer de données COLLADA (exportées par XSI|Softimage) sous Ogre3D.

    Pour parser le COLLADA j'utilise des fonctions basiques de ColladaDOM. Pour de petits fichiers pas de problèmes, mais dès que je teste mon code sur un fichier plus gros (toujours le même fichier de 9 Mo) le code s'avère instable : j'obtiens assez rarement l'objet dans le viewer ; la plupart du temps ça crashe avant...

    J'ai alors recodé en plus bas niveau avec libxml2 le code qui me semblait pas assez robuste et pareil cela plante sur des fichiers trop gros souvent au même endroit quand je fais un énième appel de xmlNodeGetContent (tous les précédents marchent parfaitement) aux alentours du 20 ou 25 submesh du fichier...

    ColladaDOM utilise libxml2 peut-être es-ce lié ?

    Voilà si vous avez résolu ce genre de problème merci d'éclairer ma lanterne !

    Cordialement.

  6. #6
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Lorsque les fichiers sont volumineux, il est conseillé d'utiliser l'interface xmlreader de libxml2, plutôt que DOM (tree) ou encore SAX2 (ce dernier étant considéré comme trop archaïque).

    A noter que c'est la plupart du temps à l'utilisateur que revient la tache de désalouer la mémoire occupée par les xmlChar* retournés par les différentes interfaces. Se référer à la doc.

    Tu as peut être un prob de mémoire non restituée...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut suite ...
    Bon j'ai désalloué un maximum avec xmlFree() ça m'a affiché mon fichier 3D dans le viewer et après quelques modification de mon code (pour continuer le développement) ça plante de nouveau ...

    Je trouve effectivement que ça sent la fuite mémoire ...

  8. #8
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    je me lance dans xmlreader à mon tour mais j'ai un problème avec xmlFree()

    à la compilation j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    undefined reference to `__imp__xmlFree'
    j'ai pourtant linké libxml2.lib (v 2.7.3) ainsi que iconv.lib;

    j'ai ajouté le cflag DLIBXML2_STATIC dans code blocks (gcc 3.4.1)

    j'ai lu que ce problème revenait souvent dans l'installation de libxml

    puis-je remplacer le xmlFree() par free() tout court sans probleme ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Recherche URL dans grande chaîne de caractères.
    Par Le Mad dans le forum Développement
    Réponses: 4
    Dernier message: 10/03/2009, 15h20
  3. Très longue chaîne de caractères
    Par maloups dans le forum SQL
    Réponses: 4
    Dernier message: 13/11/2008, 18h15
  4. Meilleur algorithme pour trier de très grandes quantités de chaînes de caractères
    Par Cecilka dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/05/2006, 11h23
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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