Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1450 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [libxml] Très grandes chaines de caracteres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[libxml] Très grandes chaines de caracteres

n°1910810
spinor
Posté le 31-07-2009 à 19:14:33  profilanswer
 

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

Code :
  1. xmlChar *ch

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 .

mood
Publicité
Posté le 31-07-2009 à 19:14:33  profilanswer
 

n°1910845
tpierron
Posté le 31-07-2009 à 20:53:30  profilanswer
 

spinor a écrit :

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


 
Je ne connais pas trop la libxml2, mais expat (api C sax) fonctionne de la même manière, ce qui me semble être un comportement sensé. J'imagine que la lib doit lire le fichier par bloc et transmettre un morceau de ce bloc correspondant aux données du noeud, donc illusoire d'espérer d'avoir un noeud de plusieurs Mo en un seul morceau.

n°1910853
spinor
Posté le 31-07-2009 à 22:01:55  profilanswer
 

Oui mais la fonction d'appel va toujours renvoyer le même bloc, c'est-à dire le début, non?

n°1910856
xilebo
noone
Posté le 31-07-2009 à 22:18:13  profilanswer
 

s'il s'agit uniquement de lire des données dans un fichier XML sans avoir à les modifier, inutile d'utiliser une bibliothèque aussi complexe que libxml2 (à moins qu'elle soit imposée). Ecrire un parser XML en C est assez rapide, et tu pourras te passer de cette limite :)

n°1910858
spinor
Posté le 31-07-2009 à 22:21:52  profilanswer
 

J'ai juste besoin d'un parser en effet, mais je traite de très gros fichier comme dit plus haut et j'ai lu que libxml2 était très performante
 
Cependant si vous avez des suggestions d'api xml en C/C++ simples et très rapides...  :jap:

n°1910859
xilebo
noone
Posté le 31-07-2009 à 22:23:19  profilanswer
 

en C++, j'utilise tinyxml qui fonctionne plutôt bien. Par contre, je ne peux rien dire ni sur ses performances (mes fichiers font 2MO max), ni sur la taille max d'un champ.

n°1910862
xilebo
noone
Posté le 31-07-2009 à 22:47:03  profilanswer
 

Je viens de faire un test rapide, en créant un fichier xml de la façon suivante :  
 

Code :
  1. <test>
  2. <balise val="1" champ="DATAFAISANT1MO"/>
  3. <balise val="2" champ="DATAFAISANT1MO"/>
  4. </test>


 
Puis j'ai testé (rapidement, regardez pas les non-tests, c'est juste pour un benchmark)
 

Code :
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include "tinyxml.h"
  4. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  5. {
  6.     TiXmlDocument doc;
  7.     if (doc.LoadFile("test.xml.txt" )) {
  8.         TiXmlElement *pNode = doc.FirstChildElement();
  9.         TiXmlElement *pValNode = pNode->FirstChildElement("balise" );
  10.         while (pValNode) {
  11.             int val;
  12.             pValNode->Attribute("val",&val);
  13.             char szName[32];
  14.             sprintf(szName,"%d.txt",val);
  15.             FILE *f = fopen(szName,"wt" );
  16.             if (f) {
  17.                 fprintf(f,"%s",pValNode->Attribute("champ" ));
  18.                 fclose(f);
  19.             }
  20.             pValNode=  pValNode->NextSiblingElement("balise" );
  21.         }
  22.     }
  23.     // The user interface is a modal dialog box
  24.     return 0;
  25. }


 
voici le résultat d'exécution sous code-blocks :
 
 

Citation :


 
Process returned 0 (0x0)   execution time : 0.194 s
Press any key to continue.


 
 
Le fichier XML fait 2,33 MO. Les 2 fichiers 1.txt et 2.txt générés sont complets.


Message édité par xilebo le 31-07-2009 à 22:52:55

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [libxml] Très grandes chaines de caracteres

 

Sujets relatifs
Compte le mombre de chaines (occurence) dans une variableprog pour supprimer tous les caractères entre parenthèses WORD 2007
Petites images et grandes images...Recherche chaine de caractères
[RESOLU]TRés URGENT chekbox et passage de variable[C#] Convertir caractères spéciaux HTML
Recherche des 10 premiers caractères d une cellule dans 3 tableaux.Filtrer les K plus grandes valeurs d'un vecteur
[Résolu sans trop savoir comment] Ma page s'affiche très bas[résolu] parcours d'un char** sans connaitre le nombre de chaines
Plus de sujets relatifs à : [libxml] Très grandes chaines de caracteres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR