我正在尝试读取文本文件并将每行添加到列表中。该列表用于预准备语句以将记录插入db。问题是当存在1000000条记录时,执行变得太慢并且有时会出现Out of Memory错误。
我的代码
while ((sRec = in.readLine()) != null) {
myCollection.add(reversePad(sRec, hmSizeLookup, colLength, tableName));
a = Utility.getPositions(sRec, hmSizeLookup, colLength);
i = i + 1;
}
for (int j = 0; j < a.length; j++) {
Field f = (Field) hmSizeLookup.get(String.valueOf(j));
sAllFields += f.getColumnName();
if (j < a.length) {
sValues += "?";
}
if (j < a.length - 1) {
sValues += ",";
sAllFields += ",";
}
}
sQ = "insert into " + tableName + "(" + sAllFields + ") values(" + sValues + ")";
ds1.executePreparedStatement(sQ, myCollection);
如何从文本文件中一次只读取1000行并需要执行插入操作?这应该一直持续到文本文件结束。
感谢任何建议,
由于
答案 0 :(得分:1)
您需要在文件循环中插入。
将插入代码插入一个函数,每1000行调用它,然后myCollection.clear()
在循环之后,您需要在最后一次插入后再次调用它。
类似于:
int line = 0;
while ((sRec = in.readLine()) != null) {
myCollection.add(reversePad(sRec, hmSizeLookup, colLength, tableName));
a = Utility.getPositions(sRec, hmSizeLookup, colLength);
i = i + 1;
if (++line > 1000) {
doTheInsert(myCollection);
myCollection.clear();
line = 0;
}
}
doTheInsert(myCollection);
答案 1 :(得分:1)
以下是一百万个可能的实现之一:
String sRec = null;
READ_LINES:
do {
for (int i = 0; (sRec = in.readLine()) != null && i < 1000; i++) {
myCollection.add(reversePad(sRec, hmSizeLookup, colLength, tableName));
a = Utility.getPositions(sRec, hmSizeLookup, colLength);
}
} while (sRec != null);
答案 2 :(得分:1)
伪代码仅在我出去工作时:
int maxLines=1000;
int currentLine=0;
while ((sRec = in.readLine()) != null) {
Add to collection
Increment currentLine
if currentLine % maxLnes == 0 {
UpdateDB(collection)
clear collection
currentLine=0
}
}
updateDB(collection) // catch any stragglers
对于缺乏正常工作的代码感到抱歉,但这个想法很合理,看起来你已经了解了java的方法。