Très grandes chaines de caracteres [libxml] - C - Programmation
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.
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?
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
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...
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.
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 :
|
Puis j'ai testé (rapidement, regardez pas les non-tests, c'est juste pour un benchmark)
Code :
|
voici le résultat d'exécution sous code-blocks :
Citation : |
Le fichier XML fait 2,33 MO. Les 2 fichiers 1.txt et 2.txt générés sont complets.
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
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 .