【发布时间】:2011-12-02 20:31:17
【问题描述】:
我正在使用 Teradata jdbc 驱动程序 13.00.00.10,并尝试将包含 1 亿行的平面文件上传到 teradata。
我从一张干净的桌子开始。
首先我尝试遍历整个文件,对每一行执行 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 % 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() 成功了。
但是,第二个 executeBatch() 失败,出现“开始快速加载数据库表 XXX 时出错”。
谁能解释我应该如何加载 1 亿行?
是否缺少我的配置(例如,告诉驱动程序定期推送一些更新而不是将它们保存在内存中)?
谢谢,
一个。
【问题讨论】:
-
你的陈述是什么样的?
-
在 Teradata 的开发人员交流中,您的问题似乎有答案。如果那里的解决方案是正确的,请在此处更新此问题。 (我讨厌松散的结局......):)
标签: jdbc teradata out-of-memory