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.