Comment faire passer le temps de traitement d’un job Talend de 8 heures à 45 minutes lorsque vous travaillez avec des fichiers XML ? Notre expert Dany Kassa s’est penché sur la question !
Il peut nous arriver de travailler avec des jobs qui appellent des jobs fils et qui traitent des informations de manière itérative, et que le résultat final soit un fichier XML. Nous pourrions alors être tenté d’écrire directement dans le fichier XML de sortie dans chaque job fils, en utilisant un composant comme le tAdvancedOutputXML par exemple. Mais, nous allons le voir, ce n’est pas toujours la meilleure manière de procéder.
Voici un exemple de fichier que nous aimerions obtenir en sortie :
Intéressons nous maintenant à la différence de résultats lorsque l’on écrit directement dans un fichier XML, à l’aide un tAdvancedOutputXML et lorsque l’on écrit dans des fichiers délimités temporaires avant d’écrire dans un fichier XML à l’aide d’un tFileOutputMSXML.
Prenons deux jobs : JobPere et JobPere_Copy (oui, c’est vrai, je ne me suis pas foulé pour les noms !).
Première méthode : écriture directe dans le XML
Laissez-moi vous présenter « JobPere »
Ce job utilise deux job fils, un qui écrit les informations pour les filles et l’autre qui écrit des informations pour les garçons, directement dans le fichier XML. Il a, en entrée, des fichiers csv, Garcon.csv et Fille.csv, contenant des informations sur des garçons et sur des filles.
Chaque ligne de ces fichiers est envoyée de manière itérative dans les job fils, au moyen d’un composant tFlowToIterate, et on transmet les informations sur les garçons et les filles en se servant des paramètres de contexte dans le vue Composant des tRunJob correspondant aux jobs fils.
JobFils_Garcons écrit les informations des garçons directement dans le fichier Personnes_1.xml en se servant du composant tAdvancedOutputXML.
JobFils_Filles écrit les informations des filles directement dans le fichier Personnes_1.xml en se servant du composant tAdvancedOutputXML.
Seconde méthode : écriture dans des fichiers temporaires
Découvrons maintenant « JobPere_Copy »
Le job JobPere_Copy, tout comme le job JobPere, envoie les données de manière itérative vers les jobs fils. Mais à la différence de JobPere, il écrit les données des garçons et des filles d’abord dans des fichiers temporaires délimités, et ensuite il lit ces fichiers temporaires et écrit le tout dans le fichier XML final, en utilisant un tFileOutputMSXML.
Voici le Job JobFils_Garcons_Copy qui écrit les informations des garçons dans un fichier temps csv.
Le job JobFils_Filles_Copy fait la même chose, mais avec les informations des filles.
Comparaison des performances
A présent, nous pouvons exécuter les deux jobs et comparer leurs performances. Nous allons les tester avec des fichiers Garcon.csv et Fille.csv de 100000 lignes chacun.
Dans la vue de l’onglet « Paramètres avancés » de la vue « Exécuter », cocher la case « Temps d’exécution ».
Puis exécuter.
On remarque que le job JobPere_Copy s’est terminé en 897245 millisecondes, soit environ 16 minutes.
Le job JobPere, lui, après près d’1h30, n’a même pas traité la moitié des lignes.
A une échelle plus petite, prenons des fichiers Garcon.csv et Fille.csv de 10000 lignes chacun.
Dans JobPere on a un temps de traitement de 386543 millisecondes.
Dans le deuxième job JobPere_Copy on a un temps de traitement de 56056 millisecondes.
Dans ce cas on a un temps de traitement divisé par presque 7 ! En fait, plus il y a de données à traiter, plus la différence est grande.
Conclusion
Lorsque nous devons travailler avec des fichiers XML, et que nous devons traiter les données de manière itérative, ça peut valoir le coup de stocker les données dans des fichiers délimités temporaires, puis d’écrire en une seule fois dans le fichier XML final, plutôt que d’écrire directement dans le fichier XML final au fur et à mesure que nous traitons les données.
Il est important de préciser que cette manière de procéder est efficace lorsqu’on utilise des jobs fils, et que les données sont envoyées de manière itérative aux jobs fils. Si on n’utilise pas de jobs fils, les deux méthodes que nous venons de voir aurons des performances similaires.
J’ai testé cette méthode chez un client sur un job qui durait 8 heures, maintenant il ne dure que 45 minutes environ !
Quand je vous disais qu’on peut diviser le temps de traitement par 10 !
Sections commentaires non disponible.