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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    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 Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    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 confirmé
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    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 Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    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 confirmé
    Avatar de blastobi
    Inscrit en
    Avril 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 89
    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 Expert
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    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é!

+ Répondre à la discussion
Cette discussion est résolue.

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, 16h54
  2. [XSL~FO][FOP] Créer une ancre
    Par caro. dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/04/2007, 14h16
  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, 18h51
  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, 11h35
  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, 16h58

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