2011-10-07 15 views
0

私はTeradata jdbcドライバ13.00.00.10を使用しており、1億行のフラットファイルをteradataにアップロードしようとしています。JDBCの高速ロード - 2000万回のaddBatch()操作後のOutOfMemory

私は清潔なテーブルから始めます。これは、すばやくすべてのメモリを消費し

 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(); 

は、最初に私は、行ごとにaddBatch()を行うと、端部のみに単一のexecuteBatch()を実行し、ファイル全体を反復処理しようとしました私のアプリケーション。

私は9GB XMXを設定し、〜4000万addBatch()後にOutOfMemoryを取得しました。

それから、私は定期的なexecuteBatch()を実行しようとしました。ファイルを繰り返し実行し、2,000万の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の開始中にerrror"が発生しました。

どのように私は100万行をロードするはずです説明することはできますか?

設定がありません(たとえば、ドライバに定期的にアップデートを送信し、メモリに保持しないように指示するなど)? (http://developer.teradata.com/connectivity/faq)それは言う -

おかげで、

A.

+0

あなたの文はどのようなものに見えるん? –

+0

Teradataのデベロッパーエクスチェンジに関するご質問に対する回答があるようですが、解決策が正しい場合は、ここでこの質問を更新してください。 –

答えて

2

は、よくある質問を私に向けるのTeradataユーザーフォーラムで答えを、手に入れました動作させる正しい方法は、executeBatch()を定期的に呼び出すことです。 しかし、これを行うには、接続の自動コミットをオフにする必要があります。 と最後にコミットしてください。

ので、私のコードは次のようになります。魔法のように

 **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万に設定しました。 findを働いて

も ​​- 。TeradataのJDBCでCSV fastloader機能明らかに存在している - 。一般的に、より良い性能を与えることがあり-which http://developer.teradata.com/doc/connectivity/jdbc/参照/現在/ jdbcug_chapter_2.html#のBABFGFA2を参照してくださいが

関連する問題