簡體   English   中英

Memory 嘗試在 memory 中創建大型 zip 文件時出現分配錯誤

[英]Memory allocation error when trying to create a large zip file in memory

memory 分配錯誤似乎特別發生在它到達 for 循環時並且僅適用於非常大的 storesLists。 如果 storesList.size() 約為 200 萬,我只能遇到 memory 分配錯誤。 我粘貼了 for 循環的片段,它應該根據循環中的每個 object 創建一個新行。

function 接受一個 ZipOutputStream 和一個對象列表。

 public ZipOutPutStream setStream(ZipoutputStream zos, List<Stores> storesList){
     zos.setLevel(1);
     newRow = new StringBuilder();
      for (Stores s: storesList) {
        //clearing the stringbuilder each iteration
        newRow.setLength(0);
        newRow.append(s.getId());
        newRow.append(",")
            .append(s.getTitle()).append(s.getDescription());
        newRow.append("\n");
      }
      byte[] data = result.toString().getBytes();
      zos.write(data, 0, data.length);
      zos.closeEntry();
      zos.close();
      return zos;
}

我應該改變什么才能處理非常大的列表?

當您可以直接 stream 相同的數據時,不要構建 memory 結構 - 因為巨大的結構可能會在toString()getBytes()調用中遇到OutOfMemoryError

如果您正在處理平台行分隔符,您可以像這樣寫出行:

PrintWriter w = new PrintWriter(zos/*,false, orCharSetHere*/);
for (Stores s : storesList) {
    w.println(s.getId() + "," + s.getTitle() + s.getDescription());
}
w.flush();

但是如果你想要所有平台的\n行分隔符,可以使用以下方式發送行:

OutputStreamWriter w = new OutputStreamWriter(zos/*, orCharSetHere*/);
for (Stores s : storesList) {
    w.write(s.getId() + "," + s.getTitle() + s.getDescription()+"\n");
}
w.flush();

必須刷新編寫器以確保在 zip 條目或 stream 關閉之前將任何緩沖數據寫入ZipOutputStream

暫無
暫無

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

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