2017-07-12 86 views
0

以下のようなジョブがあります。 tmysqlinput_1には、tmysqloutputに更新または挿入する必要がある行があります。 tmysqlinput_2は、tmysqloutputと同じテーブルです。 tmysqlinput_1とtmysqlinput_2はtmapの内部結合を介して結合します。しかし、私が知っているtmysqinput_1にいくつかのテスト行を入れて、更新ブランチにつながり、ジョブを実行すると、エラーが発生するスレッド "Thread-0"の例外java.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えましたメモリ不足エラー - Talend挿入/更新ジョブ

なぜこれが挿入のために起こるのではなく、更新のために起こっているのか分かりますか?

Job with update and insert branches

おかげ Rathi

答えて

0

これはあなたの才能を仕事にデータベースからダウンロードされているデータの量によって異なります。

処理は標準のETL処理なので、すべてのデータはTalendジョブにロードされ、メモリを消費します。あなたの行レイアウト(行の量x列の量x列のデータ型)によっては、多かれ少なかれRAMが必要になります。

この場合、ルックアップは非常にコストがかかり、メモリが不足していると思います。

解決の1つの方法は、完全な処理をTalendジョブではなくデータベースに設定するELTコンポーネントに処理を変更することです。

もう1つの方法は、ユースケースによっては、tMySQLOutputに「無視」または「挿入または更新」を使用することです。

0

あなたは、これは、ルックアップの設定のためのTMAPで真の一時オプションを選択することで、ディスク上に参加し

+0

を設定TMAPで一時DIRECTRYパスを与えないことができます私はこれを試してみましたが、それでも同じエラーに –

+0

を取得しています私は同じシナリオを試してみました、私が今信じているのは、ソーステーブルと宛先テーブルに参加し、ターゲットテーブルを更新/挿入する必要はありません。これは、宛先テーブルとの内部結合であるため、宛先に存在するキーだけを照合していることを意味します。だからあなたは、ソーステーブルをメインフローとして、宛先テーブルとの結合なしに置くことができ、出力コンポーネントでは挿入/更新オプションを選択するだけです。 – PreetyK

+0

あなたが提案したこの方法は私の最初のデザインでした。それは非常に遅かったので、私は他の解決策を見つけるためにベンチャーアウトしなければなりませんでした。 –