[libxml] Très grandes chaines de caracteres

Très grandes chaines de caracteres [libxml] - C - Programmation

Marsh Posté le 31-07-2009 à 19:14:33    

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 .

Reply

Marsh Posté le 31-07-2009 à 19:14:33   

Reply

Marsh Posté le 31-07-2009 à 20:53:30    

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.

Reply

Marsh Posté le 31-07-2009 à 22:01:55    

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

Reply

Marsh Posté le 31-07-2009 à 22:18:13    

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 :)

Reply

Marsh Posté le 31-07-2009 à 22:21:52    

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:

Reply

Marsh Posté le 31-07-2009 à 22:23:19    

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.

Reply

Marsh Posté le 31-07-2009 à 22:47:03    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed