[英]StringBuilder.append outofmemory
我正在使用 StringBuilder.append() 解析和處理文件如下:
StringBuilder csvString = new StringBuilder();
bufferedReader.lines().filter(line -> !line.startsWith(HASH) && !line.isEmpty()).map(line -> line.trim())
.forEachOrdered(line -> csvString.append(line).append(System.lineSeparator()));
int startOfFileTagIndex = csvString.indexOf(START_OF_FILE_TAG);
int startOfFieldsTagIndex = csvString.indexOf(START_OF_FIELDS_TAG, startOfFileTagIndex);
int endOfFieldsTagIndex = csvString.indexOf(END_OF_FIELDS_TAG, startOfFieldsTagIndex);
int startOfDataTagIndex = csvString.indexOf(START_OF_DATA_TAG, endOfFieldsTagIndex);
int endOfDataTagIndex = csvString.indexOf(END_OF_DATA_TAG, startOfDataTagIndex);
int endOfFileTagIndex = csvString.indexOf(END_OF_FILE_TAG, endOfDataTagIndex);
int timeStartedIndex = csvString.indexOf("TIMESTARTED", endOfFieldsTagIndex);
int dataRecordsIndex = csvString.indexOf("DATARECORDS", endOfDataTagIndex);
int timeFinishedIndex = csvString.indexOf("TIMEFINISHED", endOfDataTagIndex);
if (startOfFileTagIndex != 0 || startOfFieldsTagIndex == -1 || endOfFieldsTagIndex == -1
|| startOfDataTagIndex == -1 || endOfDataTagIndex == -1 || endOfFileTagIndex == -1) {
log.error("not in correct format");
throw new Exception("not in correct format.");
}
問題是當文件很大時,我會收到內存不足異常。 你能幫我轉換我的代碼以避免大文件的異常嗎?
編輯:據我所知,將一個大文件裝入字符串生成器不是一個好主意,也行不通。 所以問題是Java中的哪種結構更適合用於解析我的大文件,刪除一些行,找到一些行的索引並將文件分成幾個部分(存儲這些部分的位置可能很大)根據找到索引然后最后創建一個輸出文件?
OOM 似乎是由於您將所有行都存儲在StringBuilder
。 當文件的行數過多時,會占用大量內存,並可能導致OOM。
避免這種情況的策略取決於您對附加字符串的處理方式。 正如我在您的代碼中看到的,您只是在嘗試驗證輸入文件的結構。 在這種情況下,您不需要將所有行都存儲在StringBuilder
實例中。 反而,
int
來保存您感興趣的每個索引,(或有一個int
數組)StringBuilder
,而是檢測您正在尋找的“標簽”或“索引”的存在並將其保存在其指定的int
變量中。-1
而是相對於其他索引。 (這是您目前在indexOf()
調用中使用起始索引實現的。)for
循環來保存一些先前的行,附加它們並檢查。 (只有一個想法;你可能有更好的想法。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.