0

Teradata jdbc ドライバー 13.00.00.10 を使用しており、1 億行のフラット ファイルを Teradata にアップロードしようとしています。

私はきれいなテーブルから始めます。

最初に、ファイル全体を繰り返し処理し、各行に対して addBatch() を実行し、最後に 1 つの executeBatch() を実行しようとしました。

        while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 10000 ==0 ){
                ULogger.info(this, "imported " + i + " lines.");
            }

        }
        st.executeBatch();

これにより、アプリケーションのすべてのメモリがすぐに消費されます。

私は 9GB の XMX を設定し、約 4000 万回の addBatch() の後で OutOfMemory を取得しました。

次に、定期的な executeBatch() を実行しようとしました。ファイルを反復処理し、2000 万回の addBatch() ごとに executeBatch() を実行します。

       while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 20000000 ==0 ){
                   st.executeBatch();

                   st.clearWarnings();
            }

        }
        st.executeBatch();

この場合、最初の executeBatch() は成功しました。

ただし、2 番目の executeBatch() は「データベース テーブル XXX の FastLoad の開始中にエラーが発生しました」で失敗しました。

1億行をロードする方法を誰か説明できますか?

不足している構成はありますか (たとえば、更新を定期的にプッシュし、メモリに保持しないようにドライバーに指示するなど)。

ありがとう、

A.

4

1 に答える 1

2

FAQ - (http://developer.teradata.com/connectivity/faq) に誘導された Teradata ユーザー フォーラムで回答を得ました。ただし、これを行うには、最初に接続で自動コミットをオフにし、最後にコミットするようにする必要があります。

したがって、私のコードは次のようになります。

        **con.setAutoCommit(false);**
        while ((s = reader.readLine())!=null ){
            String[] columns = StringUtils.split(s, separator);
            for (int j=0; j <columns.length; j++){
                st.setString(j+1,columns[j]);
            }
            st.addBatch();
            i++;
            if (i % 20000000 ==0 ){
                   st.executeBatch();

                   st.clearWarnings();
            }

        }
        st.executeBatch();
        **con.commit();**

魅力のように機能します。

FAQ から 100% 明確ではない唯一のことは、チャンク サイズがどうあるべきかということです。「JVMヒープが維持できる限りの大きさ」や「将来的には50K-100Kに設定することをお勧めします。これら2つは互いに矛盾しているようです。私はそれを1000万に設定しました。作業検索。

また、Teradata JDBC には明らかに CSV 高速ローダー機能があります。http://developer.teradata.com/doc/connectivity/jdbc/reference/current/jdbcug_chapter_2.html#BABFGFA2を参照してください。これにより、一般的にパフォーマンスが向上する可能性があります。

于 2011-10-07T21:06:34.897 に答える