IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[FOP] Optimisation XSL-FO


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut [FOP] Optimisation XSL-FO
    Bonjour à tous !
    Je reviens après quelques semaines avec une nouvelle question sur la génération de documents avec FOP.
    J'ai donc écris un fichier XSL qui parse mes fichiers XML pour pouvoir générer des documents RTF.

    Or j'ai quelques soucis de consommation mémoire (je monte à 230Mo pour générer un document de 186pages contenant 38 tests), j'ai donc tenté d'optimiser mon code.
    J'ai créé plusieurs page-sequence : un pour chaque test. Sachant que chaque test contient un ou plusieurs tableau de valeurs.
    Mais cela n'a eu aucune incidence sur les performances... :/ Je pense donc avoir merdouillé quelque part.
    En élagant mon code, je me suis rendu compte que l'utilisation excessive de ressource vient des tableaux. C'est pas étonnant en soit, vu que 99% des informations sont contenues à l'intérieur, mais la différence de traitement est impressionnante ! (5 sec et 30Mo d'utilisé pour afficher les données directement sur la page / 1min15 et 230Mo dès que je tente de les insérer dans un tableau)

    Ma méthode de construction du XSL est-elle mauvaise? Car j'ai beau avoir enlevé le sommaire, les page-number-citation et les différentes références, j'arrive toujours avec un XSL très difficilement utilisable au vu des performances.

    Merci d'avance

    Voici une version simplifiée de mon XSL, les parties n'étant pas présentes ne jouant pas de manière importante sur les performances finales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    <!--
    	Transformation tool from XML file to PDF or RTF document
    -->
    <xsl:stylesheet
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
         xmlns:fo="http://www.w3.org/1999/XSL/Format">
     
    	<xsl:template match="document">
    		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
     
    		<!-- Description of each page setting of the document-->
    			<fo:layout-master-set>
    				<fo:simple-page-master master-name="simple"
    						page-height="29.7cm"
    						page-width="21cm"
    						margin-top="1.5cm"
    						margin-bottom="1.5cm"
    						margin-left="2.5cm"
    						margin-right="2.5cm">
    						<fo:region-body margin-top="1.5cm" margin-bottom="1.5cm"/>
    						<fo:region-before extent="1.5cm"/>
    						<fo:region-after extent="1.5cm"/>
    				</fo:simple-page-master>
    			</fo:layout-master-set>
     
    		<!--************** data of the document pages *****************-->
    		<xsl:for-each select="test">
    			<fo:page-sequence master-reference="simple">		
    				<fo:flow flow-name="xsl-region-body" font-family="Times" font-size="10pt">
    					<!-- Test display -->
    					<fo:block space-after="15pt" 
    						border-spacing="3pt">
    						<!-- Title of the test -->
    						<fo:block><xsl:value-of select="@title"/></fo:block>
    						<!-- data tab display -->
    						<fo:block>Tabs of values</fo:block>
    						<xsl:for-each select="tab">
    						    <fo:block space-before="10pt" space-after="10pt">
    							<!-- condition tab -->	
    							    <fo:block><xsl:value-of select="@title"/> </fo:block>
    							    <fo:table width="100%">
    								<!-- calculation of the size of one column : 16 cm / number of columns -->
    								<xsl:variable name="column_nb" select="count(line[position()=1]/cell)"/>
    								<xsl:variable name="column_size" select="16 div number($column_nb)"/>
    								<xsl:for-each select="line[position()=1]/cell">
    								    <fo:table-column column-width= "{$column_size}cm"/>
    								</xsl:for-each>
    								<!-- column names -->
    								<xsl:if test="column">
    									<fo:table-header>
    									    <fo:table-row  >
    										<xsl:for-each select="column">
    										    <fo:table-cell><fo:block>
    											<fo:block><xsl:value-of select="@column_name"/></fo:block>
    											    <xsl:if test="@scale"><fo:block>(<xsl:value-of select="@scale"/>)</fo:block></xsl:if>
    										    </fo:block></fo:table-cell>
    										</xsl:for-each>
    									    </fo:table-row>
    									</fo:table-header>
    								</xsl:if>
    								<!-- data of the tab -->
    								<fo:table-body>
    								    <xsl:for-each select="line">
    									<fo:table-row>
    									    <xsl:for-each select="cell">
    										<fo:table-cell><fo:block><xsl:value-of select="@value"/></fo:block></fo:table-cell>
    									    </xsl:for-each>
    									</fo:table-row>
    								    </xsl:for-each>
    								</fo:table-body>
    							    </fo:table>
    						    </fo:block>
    						</xsl:for-each>
    					</fo:block>
    				</fo:flow>
    			</fo:page-sequence>
    		</xsl:for-each>
    		</fo:root>
    	</xsl:template>
     
    </xsl:stylesheet>

  2. #2
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    D'après les teste que j'ai réalisé avec mon collègue il apparait que tu gagne pas mal de temps et de monté en charge si tu fait effectué la transformation par un parseur classique (MSXML ou Xerces) et un fois ton fichier en fo tu l'envoye à fop pour transformation.

    Mais bon ca reste quand même assez long si tu doit générer des fichiers de 200 pages.

    Autre question as-tu autorisés Fop a utilisés plus de mémoire ca permet de gagner un peu de temps...

  3. #3
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Merci pour l'astuce, je peux toujours essayer...
    Actuellement, j'alloue 256Mo de mémoire vive (java -Xmx256m) au lancement de FOP. Le petit (en fait GROS ^^') problème est que le nombre de pages doit théoriquement monter à 800... Chose impossible actuellement.
    Ce qui m'étonne, c'est la différence hallucinante d'utilisation mémoire dès que j'utilise des tableaux ! Je suspecte FOP de ne pas vider la mémoire entre chaque création de tableau... Mais est ce dû à une mauvaise écritude de mon XSL, c'est ce que je tente de comprendre

  4. #4
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Oui ben c'est possible déjà le premier point que je vois c'est les for-each essaye avec apply-template ca ira déjà un peut plus vite!

    Mais ce qu'il faut faire ce lire des articles sur l'améliorations de ton code XSLT cherche sur ce forum il y en a quelque uns.

    Mais à mon avis tu ne vas pas gagner grandchose car si comme tu le dit le temps est perdu quand tu fabrique un tableau ca ne va pas changer radicalement ton temps de calcul si tu améliores ton code XSLT!

    Alors je sais pas essaye avec la version béta de fop peut-être y a t'il eu des améliorations à ce niveau (je sais pas du tout je ne l'ai jamais testé)...

    Et si tu augmente la mémoire alloué par ex 512 arrive tu a généré ton doc?

  5. #5
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    A la base, j'utilise des apply-templates, mais pour condenser le code j'ai un peu tout rassembler ^^ (et ca ne change pas grand chose aux perf' )
    Je suis déjà sur la dernière version de FOP (enfin presque, je peux toujours tester la version Trunk) et 512Mo ne suffisent pas pour mes 800 pages. Ce que j'aimerai comprendre, c'est pourquoi la mémoire utilisée accroit continuellement (Logiquement, il devrait y'avoir un vidage mémoire entre chaque page-sequence)
    Je crois que je n'ai pas fini de me prendre la tête avec ma génération de doc !

    Je vais suivre ton conseil, je vais déjà aller jeter un oeil sur les améliorations XSLT du fofo. Peut être que j'y trouverai mon bonheur

  6. #6
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Si tu es fort en anglais va poster sur:

    http://groups.yahoo.com/group/XSL-FO/

    Y auront surement une réponse beaucoup plus précise!

    Si t'es pressé envoie moi ta question sur ce post en Anglais et je la post sous mon nom. Car pour se faire accepter sur ce forum il faut dés fois une semaine et c'est vrai que c'est long si on est pressé!

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    il y a une raison précise pour laquelle tu crées une occurrence de <fo:page-sequence> (et du <fo:flow> associé) pour chaque occurrence de <test>, alors que tu n'as qu'un seul <fo:simple-page-master> ?

    Plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="test">
    	<fo:page-sequence master-reference="simple">		
    		<fo:flow flow-name="xsl-region-body" font-family="Times" font-size="10pt">
    il vaudrait peut-être mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <fo:page-sequence master-reference="simple">	
    	<fo:flow flow-name="xsl-region-body" font-family="Times" font-size="10pt">			
    		<xsl:for-each select="test">

  8. #8
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Oui normalement j'ai une raison précise
    En fait, d'après ça, on peut voir différentes manière d'optimiser fop. L'une d'elle, celle qui m'intéresse, est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Use multiple page sequences. FOP starts rendering after the end of a page
     sequence is encountered. While the actual rendering is done page-by-page,
     some additional memory is freed after the page sequence has been rendered.
     This can be substantial if the page sequence contains lots of FO elements.
    J'ai donc tenté de créer un nouveau page-sequence pour chaque nouveau test. Mais j'avoue n'avoir aucun gain de performance

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par blastobi
    J'ai donc tenté de créer un nouveau page-sequence pour chaque nouveau test. Mais j'avoue n'avoir aucun gain de performance
    Je ne connaissais pas l'astuce...

    Je ne vois rien de choquant dans ta feuille de style. M'est avis que tu ne pourras optimiser que marginalement... Un truc que tu peux essayer, c'est de remplacer les largeurs relatives en pourcentage par des largeurs absolues en centimètres ; pas de miracles à en attendre, mais ça ne mange pas de pain...

  10. #10
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Je suis ravi d'avoir pu t'apprendre quelque chose
    J'attaque la mailing list de FOP et avec l'aide de Virgul, le groupe xsl-fo de Yahoo. Si jamais une solution est trouvée, je la reporterai ici.

  11. #11
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    as tu essayé de travailler avec cocoon/fop?

  12. #12
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Non je n'ai pas essayé...
    A vrai dire je découvre toutes ces technologies depuis maintenant 3 mois (sujet de stage) et je ne connais pas du tout Cocoon, sauf de nom.
    Tu penses que cela peut jouer de manière significative sur les performances? Vu mon planning relativement serré jusqu'à début août, je ne peux pas trop me permettre de jongler entre différentes technos. Mais si des améliorations peuvent en résulter, je peux bien passer un peu de temps sur Cocoon

  13. #13
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    cocoon integre fop, et en quelque minutes tu peux configurer un seul fichier "sitemap.xmap" (c une sorte de web.xml si tu t'y connait en serveur d'appli) pour generer tes fichier fo et produire de jolie pdf..moi je fais des publis de plus de 1000 pages avec bcp de texte et de graphique..et les temps sont correctes...

    ça te coute rien de regarder une demie journée....
    mais je pense que cocoon n'integre que la version 0.20.5 de fop(stable)?

  14. #14
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Merci.
    Je regarde ça ce matin... comme j'ai déjà mon xsl et mes fichiers XML, je devrais pouvoir faire quelques tests assez rapidement.
    Par contre j'espère qu'il intégre une version de FOP générant les RTF, car sinon l'entreprise va pas être contente ^^'

  15. #15
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Les problèmes portant sur l'optimisation de FOP, et Cocoon utilisant FOP, l'adoption de Cocoon ne va pas changer grand chose à tes problèmes. Il y a une fonctionnalité de Cocoon qui peut nettement améliorer les performances du rendu PDF, c'est la possibilité de mettre en cache les feuilles de styles XSL et les sources XML, voire le résultat. Mais je ne pense pas que ce soit la solution ici...

  16. #16
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    Hmmm je pense aussi, mais comme je suis *légerement* dans une impasse, je prend tout conseil. Et puis j'avoue que ça me permet aussi au passage de découvrir un nouvel outil

    Et d'après les premières réponses de la mailing list de FOP, les ressources utilisées n'ont rien d'exceptionnelles. Bref les possibilités d'amélioration ont l'air limitées. Domage, quand je voit que XFC (payant ) est capable de générer avec le même XSL un document RTF en 20sec et 30Mo constant.

    Valal, les doc de 1000pages et plus que tu génères se présentent comment? Et quel type de machine tu utilises? Car personnelement, ce sont mes tableaux qui posent problèmes. Le temps de génération n'est pas vraiment une contrainte, c'est surtout la mémoire utilisée. Je pense pouvoir les persuader de passer à 1Go sur le pc de test (ils n'ont pas trop le choix en même temps s'ils veulent l'utiliser) mais je vais atteindre difficilement les 700 - 800 pages.

  17. #17
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valal, les doc de 1000pages et plus que tu génères se présentent comment?
    il contiennent des centaines de tableau (simples ou complexes) des graphiques (svg, tiff).
    bcp de texte en plusieurs langues, j'ai également pas mal de page-sequence dans chaque publi .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    les ressources utilisées n'ont rien d'exceptionnelles
    j'ai pas une bête de course (même si conseillé) [p4 et en ram j'ai 512].

    ps:t'utilse quoi comme version fop actuellement?

  18. #18
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Es-tu absolument sûr que ce sont tes tableaux qui posent problèmes, et pas des images ou autres ?

  19. #19
    Membre régulier
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    Points : 112
    Points
    112
    Par défaut
    J'utilise la version 0.92 de FOP, car l'une des contraintes m'étant imposée est la génération d'un document lisible et éditable sous Office 2003 (d'où le besoin de RTF)

    Ce ne sont pas les images qui posent problèmes, je n'en ai que 2 (entête et pied de page de la première page).
    En fait, j'ai décomposé mon XSL pour cerner la partie consommant le plus de mémoire. Tant que je ne genère pas de tableaux, aucun problème. Le cas que j'ai trouvé très flagrant a été d'écrire un document brut, affichant les données directement à la suite les une des autres : 5sec et 45Mo de mémoire vive utilisée/ les données contenus dans un tableau : 1min20 et 240Mo de mémoire vive utilisée.

    edit : pour information, les tableaux actuellement utilisés pour mes tests se composent d'environ 180 lignes et 6 colonnes, soit près de 1100 cellules par tableau.

    edit2 : je viens de faire un petit test entre la version 0.20.5 et 0.92 de FOP. La différence est flagrante pour un document final de 300 pages :
    - FOP 0.20.5 : 170Mo de mémoire vive max, 1 minute nécessaire à la génération, fichier PDF de 721Ko au final.
    - FOP 0.92 : 400Mo de mémoire vive max, 3 minute nécessaire à la génération, fichier PDF de 1080Ko au final.
    Les boules que l'entreprise tienne à son format RTF, m'obligeant à rester sur la 0.92, car pour le PDF y'a pas photo...

  20. #20
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Oui mais alors pourquoi ne pas faire deux feuille de style et utilisé WordML pour faire tes fichiers office 2003 qui seront plus léger que ceux générer FOP.

    Ca peux être un argument!

    Je sais ca fait deux feuilles au lieu d'une!

    Mais moi je crains fort (je n'ai pas testé donc encore une fois ce ne sont que des supositions) que certaine combine passe pour le pdf et pas pour le rtf ce qui fait que tu auras de toute facons deux feuille différente.

    de plus c'est génial wordml un fichier xml qui est automatiquement reconnu par l'os et qui te permet de faire des choses bie plus précise qu'avec RTF (car 99% des fonctions de word sont atteignable avec ce format) et qui est en plus bien expliqué et ou toute les fonctions marche.


    Bref je sais pas mais...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [FOP] "XML+XSL" hyperlien récalcitrant
    Par Zildjian dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 30/06/2008, 17h54
  2. [XSL~FO][FOP] Créer une ancre
    Par caro. dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/04/2007, 15h16
  3. [XSLT] Prémunir serveur contre surcharge - optimisation XSL
    Par thibaut06 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/11/2006, 19h51
  4. [PDF - FOP - XSL] Récupérer le numéro d'une page
    Par caro. dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/02/2005, 12h35
  5. [XML][XSL][FOP] transformation xml avec fop
    Par Le Marlou dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/12/2003, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo