Question

J'utilise un analyseur syntaxique Expat pour analyser un fichier XML d'environ 15 Go. Le problème est que cela jette un " Mémoire insuffisante " erreur et le programme échoue.

Je veux savoir si un corps a rencontré un problème similaire avec l'analyseur Expat ou s'agit-il d'un bogue connu qui a été corrigé dans les versions ultérieures?

Était-ce utile?

La solution

J'ai déjà utilisé expat pour analyser de gros fichiers et je n’ai jamais eu de problèmes. Je suppose que vous utilisez SAX et non l'un des wrappers DOM expat. Si vous utilisez DOM, c’est votre problème, c’est essentiellement essayer de charger tout le fichier en mémoire.

Attribuez-vous des objets lorsque vous analysez le code XML et ne les désaffectez peut-être pas? Ce serait la première chose que je vérifierais. Une façon de vérifier si le problème est vraiment lié à expat - si vous réduisez le programme à une version simple avec des gestionnaires de balises vides (c’est-à-dire qu’il n’analyse que le fichier et ne fait rien avec les résultats), manque-t-il toujours de mémoire?

Autres conseils

Je ne connais pas du tout expatrié, mais je suppose qu’il doit garder trop d’états en mémoire pour une raison quelconque. Le XML est-il mal formé d'une certaine manière? Avez-vous des gestionnaires enregistrés pour les balises de fin de gros blocs?

Je pense que si vous avez un gestionnaire enregistré pour la fin d'un bloc volumineux et si expat est censé transmettre le bloc au gestionnaire, il risque de manquer de mémoire avant de pouvoir rassembler complètement ce bloc. . Comme je l'ai dit, je ne connais pas les expatriés, donc cela pourrait ne pas être possible, je demande juste.

Sinon, êtes-vous sûr que Expat est l'endroit où la perte de mémoire est? Je pouvais imaginer une situation dans laquelle vous conserviez des informations sur le contenu du fichier XML et sur vos propres structures de données, soit parce que les données étaient trop volumineuses, soit à cause de fuites de mémoire dans votre code, ce qui provoquait un manque de mémoire.

Expat est un analyseur d’évènements qui ne construit pas de grandes structures en mémoire. Donc, le problème n’est probablement pas expatrié (ce qui est très largement utilisé pour analyser des fichiers volumineux) - il est plus probable que ce soit votre propre code.

Expat a des fuites. J'ai commencé à l'utiliser sur un serveur de longue durée et constate qu'il perd constamment de la mémoire, que l'analyseur soit libéré ou non. Les versions plus récentes de xmlparse.c ne résolvent pas ce problème, masquent uniquement les fuites existantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top