|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 20 ![]() |
Bonjour,
Je dispose de 2 tables tel que: |-----------------------| | TABLE_1 | ------------------------| | ID_GLOBAL_1 | PK | | ID_SECONDAIRE | -- | | ... | |-----------------------| => 5 millions d'enregistrements |-----------------------| | TABLE_2 | ------------------------| | ID_GLOBAL_2 | PK | | ID_SECONDAIRE | -- | | ... | |-----------------------| => 6 millions d'enregistrements Ces deux tables ont en commun le même identifiant secondaire (indexé) de telle sorte qu'un enregistrement de la TABLE_1 peut être en relation avec 0 ou n enregistrements de la TABLE_2. |-----------------------| | TABLE_REL | ------------------------| | ID_GLOBAL_1 | PK | | ID_SECONDAIRE | PK | |-----------------------| Pour diverses raisons je souhaite créer une table de relations où mettre en correspondance les champs TABLE_1.ID_GLOBAL_1 et TABLE_2.ID_SECONDAIRE. J'ai donc créé un job avec de 2 tMysqlInput en relation avec un tMap où est précisée la jointure ainsi que la sortie sur un tMysqlOutput. C'est simple, ça marche avec des données de tests (quelques enregistrements) mais pas qquand ça mouline sur des millions... Le job échoue sur une seule exception java "Exception in thread "Main Thread" java.lang.OutOfMemoryError" au bout d'une dizaine de minutes sans qu'aucun enregistrement ne soit inséré dans la table de relation. J'ai modifié le script de lancement pour allouer plus de mémoire (-Xmx 1700M) et c'est toujours pareil. Est-ce que vous avez une idée d'où peut provenir ce problème?? J'ai aussi l'impression que les enregistrements sont insérés à la fin du job et non en cours, je me trompe?? Mici! Talend 2.3.2 Java 1.5 Mysql 5.0.45 en MyISAM |
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Benoit DurandConsultant en Business Intelligence Freelance Inscription : mars 2005 Messages : 818 ![]() |
Les jointures dans les tMap sont à bannir pour les gros volumes ( voire bannir tout court) !!
Citation:
Je te conseille vivement de faire un seul select avec dedans un inner join ou left outer join sur tes 2 tables. Ton sgbd est conçu pour faire des jointures donc autant l'utiliser. Bien sûr il faut que les 2 tables soient dans la même base. Dans le cas contraire il vaut mieux passer par une table temporaire pour avoir les données dans la même base. Il existe depuis la 2.3 le composant tJoin, plus léger que le tMap mais je en l'ai pas testé. J'espère t'avoir aidé. Cordialement |
|
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 20 ![]() |
Merci ça marche
J'ai donc utiliser un tMysqlInput où j'ai spécifié une requête me permettant de récupérer les champs résultant de la jointure ainsi que leur schema. J'ai diriger le tout vers un tMap afin d'orienter les données vers les tables voulues. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com