读取文本文件并添加到列表中时出现内存不足错误

时间:2012-11-06 07:28:35

标签: java arrays file

我正在尝试读取文本文件并将每行添加到列表中。该列表用于预准备语句以将记录插入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行并需要执行插入操作?这应该一直持续到文本文件结束。

感谢任何建议,

由于

3 个答案:

答案 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的方法。