2017-07-12 8 views
1

CloverETLツールを使用して100,000行以上の大きなcsvファイルを読み込み、DBテーブルに挿入する前に一部のルックアップ値を変換します。大きなcsvファイルをジョインで処理する際のClover ETLパフォーマンスの問題

基本的に私が使用される:

  1. を読み取るためのフラット・ファイル・リーダーをファイルに
  2. 続いて多数のDB
  3. からいくつかの値を変換するために「ルックアップ参加」を「ExtHashJoin」すべてのデータをリンクします(ソースはソートされていないため)
  4. 次にレコードをDBに挿入します。

かなり簡単なプロセスであり、少数のレコードでうまく動作します。しかし、ファイル全体をインポートしようとすると、メモリが不足してしまいます(メモリの割り当てを増やすことはできません)。

ExtHashJoinは、すべてのレコードをメモリに保存する必要があるため、挿入しようとする前にすべてのレコードを結合するまで待機しようとしています。私はそのような行動を本当に必要としません。これらのレコードはすべて独立しており、バッチで処理することができます。 1000行ごとに1回ずつ実行しますが、このようにする方法はわかりません。

また、異なるフェーズ値を設定しようとしましたが、最初のレコードの挿入を開始する前に、すべての値を結合しようとします。

フラットファイルリーダーにレコードを分割してバッチ処理する方法を教えてください。

ありがとうございました。

エリック

答えて

1

記録を打破し、バッチでそれらを処理するためにFlatFileReaderコンポーネントを強制する簡単な方法はありません。 (スレーブ・ポートからの)すべてのレコードが前に流れるまで、あなたは間違いなく、ExtHashJoinコンポーネントの待機を示したように

  1. :しかし、私はあなたがExtHashJoin成分によるメモリオーバーフローの問題を解決するのに役立つかもしれないいくつかのヒントを提案することができます参加が開始されます。結合するスレーブポートレコードの数がかなり少ない場合、ExtHashJoinコンポーネントを使用することをお勧めします。これが当てはまらない場合は、ExtMergeJoinコンポーネントの使用をお勧めします。キャッシュはありません(ExtHashJoinと違って)ので、処理が大幅に高速になる可能性があります。 ExtHashJoinコンポーネントと同じマスター/スレーブキー定義とExtMergeJoinコンポーネントのマッピングを適用することができます。ただし、グラフ内のSimpleCopyコンポーネントの前に新しいExtSortコンポーネントを配置して、ソートされたデータを送信する必要があります。ソートキーは、ExtMergeJoinコンポーネントで定義されたマスターキーと一致する必要があります。
  2. FlatFileReaderからExtHashJoinコンポーネントへの途中でデータの並べ替え順序が変更されない場合は、メモリ消費量を減らすための簡単な方法があります。 ExtHashJoinコンポーネントを新しいCombineコンポーネントに置き換え、ExtHashJoinコンポーネントの場合と同じマッピングを適用してください。 Combineコンポーネントはレコードのキャッシュも行わず、キーで結合する必要はないので、パフォーマンスはかなり良いはずです。このトピックに関する

詳細はCloverETLフォーラムで見つけることができます:http://forum.cloveretl.com/viewtopic.php?p=12926#p12926

+0

は答えるために非常に多くのValdiをいただき、ありがとうございます。私はFastSortを配置した後にExtMergeJoinを使用しようとしましたが、今は正常に動作しているようです。 –

関連する問題