0

我正在尝试读取文本文件并将每一行添加到列表中。该列表在准备好的语句中用于将记录插入到数据库中。问题是当有 1000000 条记录时,执行变得太慢,并且有时会出现内存不足错误。

我的代码

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 行并需要执行插入操作?这应该一直持续到文本文件的结尾。

任何建议表示赞赏,

谢谢

4

3 回答 3

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);
于 2012-11-06T07:36:12.503 回答
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);
于 2012-11-06T07:37:21.643 回答
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 方式。

于 2012-11-06T07:37:50.873 回答