簡體   English   中英

StringBuilder.append 內存不足

[英]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實例中。 反而,

  1. 有多個int來保存您感興趣的每個索引,(或有一個int數組)
  2. 不是將行添加到StringBuilder ,而是檢測您正在尋找的“標簽”或“索引”的存在並將其保存在其指定的int變量中。
  3. 最后,您已經在進行的檢查可能需要進行更改以測試不是-1而是相對於其他索引。 (這是您目前在indexOf()調用中使用起始索引實現的。)
  4. 如果存在跨行標記的風險,那么您可能無法使用流,但必須使用一個簡單的for循環來保存一些先前的行,附加它們並檢查。 (只有一個想法;你可能有更好的想法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM