Discussion:
xsltproc sur de gros fichiers
(trop ancien pour répondre)
CrazyCat
2009-11-17 16:31:26 UTC
Permalink
Bonjour,

Je ne sais pas si ce groupe convient pour ma question, mais je tente
quand même, quelqu'un saura bien m'aiguiller vers le bon groupe si
nécessaire :)

Je dois procéder à des transformations xsl sur des fichiers xml, jusque
là que du normal.
Pour se faire, j'utilise xsltproc et ça fonctionne plutôt bien avec des
fichiers XML allant jusqu'à 100Mo. Mais au dessus (il y en a un de
800Mo), ça prend toute la mémoire de la machine et semble même tout bloquer.

Avez-vous une astuce pour traiter les xml sans les charger complètement
en mémoire ou dois-je me résoudre à scinder les gros fichiers en des
entités plus petites ?

Pour info, la machine fonctionne sous Fedora.

Merci d'avance.
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Mickaël Wolff
2009-11-18 13:23:14 UTC
Permalink
Post by CrazyCat
Bonjour,
Je ne sais pas si ce groupe convient pour ma question, mais je tente
quand même, quelqu'un saura bien m'aiguiller vers le bon groupe si
nécessaire :)
Je dois procéder à des transformations xsl sur des fichiers xml, jusque
là que du normal.
Pour se faire, j'utilise xsltproc et ça fonctionne plutôt bien avec des
fichiers XML allant jusqu'à 100Mo. Mais au dessus (il y en a un de
800Mo), ça prend toute la mémoire de la machine et semble même tout bloquer.
Par curiosité je suis allé voir le source de xsltproc, libxslt, et
libxml. Et effectvement, le parser analyse le fichier d'un coup, et
concerve les arbres des différents documents XML.
Post by CrazyCat
Avez-vous une astuce pour traiter les xml sans les charger complètement
en mémoire ou dois-je me résoudre à scinder les gros fichiers en des
entités plus petites ?
Si c'est urgent, certainement. Maintenant il doit bien exister un
parser qui soit capable de gérer des gros fichiers de manière efficace.
Mais trois (sablotron, expat et xsltproc) que j'ai regardé n'en semble
pas capable.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
CrazyCat
2009-11-19 07:38:01 UTC
Permalink
Merci Mickaël et Alain de vos réponses.
Post by Mickaël Wolff
Post by CrazyCat
Avez-vous une astuce pour traiter les xml sans les charger
complètement en mémoire ou dois-je me résoudre à scinder les gros
fichiers en des entités plus petites ?
Si c'est urgent, certainement. Maintenant il doit bien exister un
parser qui soit capable de gérer des gros fichiers de manière efficace.
Mais trois (sablotron, expat et xsltproc) que j'ai regardé n'en semble
pas capable.
Finalement, je traite "à la main" le fichier en le lisant ligne par
ligne afin de recréer chaque node et je le parse à ma ma manière (en
perl), ce qui est bien plus rapide.

J'ai essayé de faire des fichiers xml plus petits mais entre la création
et le traitement par xslproc, je consomme bien trop de ressources
machine et de temps. Parfois, le plus simple est le mieux.
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Alain Ketterlin
2009-11-18 13:47:09 UTC
Permalink
Post by CrazyCat
Je dois procéder à des transformations xsl sur des fichiers xml,
jusque là que du normal.
Pour se faire, j'utilise xsltproc et ça fonctionne plutôt bien avec
des fichiers XML allant jusqu'à 100Mo. Mais au dessus (il y en a un de
800Mo), ça prend toute la mémoire de la machine et semble même tout bloquer.
Avez-vous une astuce pour traiter les xml sans les charger
complètement en mémoire ou dois-je me résoudre à scinder les gros
fichiers en des entités plus petites ?
Ca dépend trop de la transformation XSLT : il suffit d'un //, d'un
<xsl:sort>, etc. pour qu'on ne puisse plus s'épargner le chargement en
mémoire. A ma connaissance, Xalan avait le projet de faire cela (il y a
longtemps), mais je crois qu'ils ont laissé tomber rapidement. Je ne
connais pas de processeur XSLT qui implémente cela.

Si ta transformation est suffisamment simple, ou si tu dois extraire un
morceau du fichier, je te conseille d'écrire cela a la mano avec SAX (au
moins pour la partie extraction).

-- Alain.
xmlizer
2009-11-19 11:48:51 UTC
Permalink
Bonjour,

En fait, il est possible d'optimiser le traitement tout en restant
compatible XML

Nous faisons des formations et l'intégration des outils pour faire
ceci

Cordialement,

Xmlizer
Post by CrazyCat
Bonjour,
Je ne sais pas si ce groupe convient pour ma question, mais je tente
quand même, quelqu'un saura bien m'aiguiller vers le bon groupe si
nécessaire :)
Je dois procéder à des transformations xsl sur des fichiers xml, jusque
là que du normal.
Pour se faire, j'utilise xsltproc et ça fonctionne plutôt bien avec des
fichiers XML allant jusqu'à 100Mo. Mais au dessus (il y en a un de
800Mo), ça prend toute la mémoire de la machine et semble même tout bloquer.
Avez-vous une astuce pour traiter les xml sans les charger complètement
en mémoire ou dois-je me résoudre à scinder les gros fichiers en des
entités plus petites ?
Pour info, la machine fonctionne sous Fedora.
Merci d'avance.
--
Réseau IRC Francophone:http://www.zeolia.net
Aide et astuces :http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops:http://www.eggdrop.fr
Mayeul
2009-11-19 12:16:16 UTC
Permalink
Post by xmlizer
En fait, il est possible d'optimiser le traitement tout en restant
compatible XML
Je ne suis pas sûr de comprendre. En restant compatible XML, oui, on
s'en doute, mais en restant compatible XSLT ?


--
Mayeul
xmlizer
2009-11-20 11:04:13 UTC
Permalink
Oui compatible XSLT 2 aussi
La version payante de Saxon permet de faire un certain nombre de
traitement en streaming, mais cela dépends de tellement de paramètre
qu'il m'est impossible de répondre définitivement que cela
fonctionnera

Xmlizer
Post by Mayeul
Post by xmlizer
En fait, il est possible d'optimiser le traitement tout en restant
compatible XML
Je ne suis pas sûr de comprendre. En restant compatible XML, oui, on
s'en doute, mais en restant compatible XSLT ?
--
Mayeul
Philippe Poulard
2009-11-20 09:12:57 UTC
Permalink
Post by CrazyCat
Bonjour,
Je ne sais pas si ce groupe convient pour ma question, mais je tente
quand même, quelqu'un saura bien m'aiguiller vers le bon groupe si
nécessaire :)
Je dois procéder à des transformations xsl sur des fichiers xml, jusque
là que du normal.
Pour se faire, j'utilise xsltproc et ça fonctionne plutôt bien avec des
fichiers XML allant jusqu'à 100Mo. Mais au dessus (il y en a un de
800Mo), ça prend toute la mémoire de la machine et semble même tout bloquer.
Avez-vous une astuce pour traiter les xml sans les charger complètement
en mémoire ou dois-je me résoudre à scinder les gros fichiers en des
entités plus petites ?
Pour info, la machine fonctionne sous Fedora.
Merci d'avance.
Bonjour,

j'imagine que le XSLT ne traite pas toutes les données; pourquoi alors
ne pas stocker ce gros fichier dans une BD native XML, et utiliser
XQuery pour l'extraction de la partie utile à la transformation ?
--
Cordialement,

///
(. .)
--------ooO--(_)--Ooo--------
| Philippe Poulard |
-----------------------------
http://reflex.gforge.inria.fr/
Have the RefleX !
Loading...