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

Développement de jobs Discussion :

Comment faire un traitement sequentiel des données


Sujet :

Développement de jobs

  1. #1
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut Comment faire un traitement sequentiel des données
    Bonjour et bonne année.
    je suis confronté à un problème qui m'embête.J'ai une table avec plus de 5 millions d'enregistrement que je dois denormaliser. puis à inserer dans une autre table
    pr ce faire j'ai utiliser (toracleIntput=>tmap=tdenormalize=>toracleoutput)
    probleme: quand les données arrive dans le tdenormalize , j'ai un message d'erreur que voici Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded car mon tdenormalize ne peut pas stocker plus de 4 millions d'enregistrement.
    la solution que je propose est de faire un traitement sequentiel des données cad lire à chaque fois les 10000 prèmières lignes, les traiter puis passer au suivant. Mais je sais pas quel composant talend peut m'aider à le faire.
    merci de votre aide

  2. #2
    Membre émérite
    Avatar de haskouse
    Homme Profil pro
    Salesforce
    Inscrit en
    Août 2009
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Salesforce
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2009
    Messages : 923
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour,

    Je n'ai pas en tête maintenant une idée pour faire ça avec un composant Talend, mais la solution la plus simple c'est d'augmenter la mémoire JVM.

    Pour cela tu peux aller dans les paramètres avancées d’exécution du job et y mettre un seuil maximal plus grand.

    Cordialement,
    "Le savant qui enseigne le bien aux gens et ne le met pas en pratique, est semblable à la torche qui éclaire en se brûlant." Mohammed le Messager d’Allah (que la paix et le salut d'Allah soient sur lui)

    Tutoriels Talend
    Mes articles publiés
    Mon CV en-ligne

  3. #3
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    Tu ne peux pas ajouter un ordre dans ta requête oracle et utiliser un tDenormalizeSortedRow ?
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  4. #4
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut
    Bonjour,j'ai agrandi la memoire de la jvm et j'ai aussi utliser 1 tDenormalizeSortedRow et ça fonctionne.Mais je constate un problème de lenteur au niveau de l'insertion des données dans la base de donnees. au fait le but de ce job est de prendre des données dans la base de production, de les denormalizer puis de les inserer dans une autre base de donnée.
    voici ce qui est fait (ToracleInput =>tmap =>tDenormalizeSortedRow(pr denormalizer toutes les données arrivant) =>tflowtoIterate(pr la lecture ligne a ligne de chaque flow) =>tOracleRow(avec une instruction d'insertion ligne à ligne des flow envoyés). j'avoue c'est pas la bonne manière car trop lent pour l'insertion des donnée mais je trouvais pas une autre manière de faire.

    quelqu'un à une idée pour l'insertion rapide de tout le parquet ramené par le tdenormalizesortedrow

  5. #5
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    Un utilisant un tOracleRow tu crées autant de requettes en Java que de lignes insérés, ça ne peux pas être performant.

    Premiere option :
    tFixedFlowInput + tOracleOutput
    Je craint que ça soit aussi lent car on est dans un flux iterate

    Deuxième solution :
    Tu écris dans un fichier en mode append et ensuite quand ton fichier est complet tu remplis ta table avec les données du fichier.

    Troisième solution :
    Tu prends la premiere, tu regardes les codes de début, principal et de fin du tOracleInput
    Tu ajoutes un tJavaFlex avec autopropagation avant le flux iterate ou tu copies les codes de début et de fin du tOracleOutput dedans dans les champs code de début et code de fin et tu remplaces ton tOracleOutput par un tJavaRow dont le code est le code main du tOracleOutput.
    Cette solution sera efficace et difficile à maintenir
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  6. #6
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    Pourquoi tu utilise un connection iterate ? ça te sert à rien au fait !
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  7. #7
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    le tflowtoiterate me permet de recuperer chaque valeur issue de mon tdenormalizer et de pourvoir ensuite les inserer.
    sans le tflowtoIterate j'obtient qu'une seule ligne en sortir.ce qui n'est pas juste plusieurs enregistrement issue de ma denormalisation.
    Au fait je ne peut pas utiliser le tOracleOutput je ne connais d'emblé le nom des tables.
    Ok on commence par le debut.
    j'ai une requete qui me permet la selection de la structure de la table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT distinct CharHeadExCde, CharExCde FROM testbi
    order by CharHeadExCde,CharExCde
    voici ce que fait le job de creation de la structure ;chaque CharHeadExcde sera un nom de table, et chaque charExcde associé à un charHeadExcde sera une colonne de la table toracleInput=>tmap=>tdenormalize=>tflowtoIterate =>toracleRow contenant l' instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    \n--\ncreate table "((String)globalMap.get("row3.CharHeadExCde"))+"("+((String)globalMap.get("row3.CharExCde"))+")"
    e
    Ensuite il faut alimenter les tables crées
    le job insere dans les tables tous les valeurs(charval) issue de la denormalisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT distinct CharHeadExCde, CharExCde, charVal FROM testbi
    order by CharHeadExCde,CharExCde
    toracleInput=>tmap=>tdenormalizeSortedRow=>tflowtoIterate =>toracleRow
    "\n--\n insert into "((String)globalMap.get("row7.CharHeadExCde"))+"("+row7.CharExCde+") "+" values ("+ row7.CharVal +")")

    tu comprends l'importance du tflowtoIterate .

  8. #8
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    Si j'ai bien compris le job de création de structure est un job que tu lances avant ?

    Si c'est ça
    Tu peux supprimer ton tFlowToIterate, il te sert à rien avec ton tOracleRow.
    Il aurait eu une utilité avec un tOracleOutput alimenté par un tFixexFlowInput par exemple .


    Personnellement je te conseille d'utiliser un prepared statement pour exécuter ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into "((String)globalMap.get("row7.CharHeadExCde"))+"("+row7.CharExCde+") "+" values ("+ row7.CharVal +")")
    Cette utilisation n'est pas performante pour deux raisons :
    1. Elle utilise la concaténation de String en Java qui est très coûteux
    2. tu envoies autant de requêtes à Oracle que de lignes


    Utilise cette requête et sans tFlowToIterate sinon tu vas toujours avoir les mêmes problèmes (Tu vas créer autant de prepare statement que de ligne, et ça va te coûter cher en temps)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ? values ( ? )
    Dans les paramètres avancés , tu coches utiliser l'instruction préparée.
    Tu remplie le tableau comme ça :
    Index des paramètres Type de paramètre Valeur du paramètre
    1 String row7.CharHeadExCde
    2 String row7.CharVal


    Voilà quelque optimisation que je te conseille de mettre en place, ça sera déjà plus rapide. Après tu as une grosse volumétrie, ça prendra toujours du temps mais moins.

    Tu peux regarder la documentation oracle http://docs.oracle.com/javase/tutori.../prepared.html .
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  9. #9
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut
    le tps d'execution s'est nettement amelioré sans que je n'utilise les prepare statement.tks

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/10/2008, 13h32
  2. comment faire quand on a des cardinalités 0,1 1,n ?
    Par zana74 dans le forum Requêtes
    Réponses: 6
    Dernier message: 25/08/2006, 09h06
  3. Réponses: 10
    Dernier message: 19/06/2006, 19h04
  4. Comment faire pour le passage des paramètres
    Par dauphin34000 dans le forum Oracle
    Réponses: 14
    Dernier message: 25/04/2006, 14h18
  5. [VB6] Comment faire un update sur des textbox qui sont créés
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 16/02/2006, 14h52

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