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

100 万通りの実装のうちの 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 に答える