2017-10-18 102 views
0

我正在嘗試在64000條記錄中一次寫入大量數據到文件。我收到以下附加的例外情況。 enter image description here寫入文件時發生java堆空間錯誤

,我以前寫的代碼是

Path outputpath = Paths.get("file1.json"); 
try (BufferedWriter writer = Files.newBufferedWriter(outputpath, StandardCharsets.UTF_8, WRITE)) { 
writer.write(jsonObject.toString()); 
} catch (Exception e) { 
//error msg 
} 

這裏我「的JSONObject」只不過是其中包含65000行的JSON數組。

您能否幫我以有效的方式將此文件寫入我的文件,以便我可以避免出現堆空間錯誤

+0

不要爲您的JSON創建內存表示,請將其傳輸到'writer'。 –

+0

你可以試試這個解決方案: https://stackoverflow.com/questions/1062113/fastest-way-to-write-huge-data-in-text-file-java –

+0

當你啓動時爲你的JVM提供更多的內存它看看-Xmx命令行選項。或嘗試像MleRutte建議的流式傳輸 –

回答

-1

您可以通過JSON對象嘗試iterate

Iterator<String> keys = (Iterator<String>) jsonObject.keys(); 
while (keys.hasNext()) { 
    String key = keys.next(); 
    JSONObject value = jsonObject.getJSONObject(key); 
    writer.write(value.toString()); 
} 

PS。你需要檢查你的json對象的結構。

1

你已經減少了你的堆棧跟蹤,但我會假設異常發生在jsonObject.toString()中。

基本上,你必須在兩件事情之間做出決定:分配更多的內存或將大操作分成幾個較小的內存。添加內存很簡單,但如果您將來需要更多的數據,它不會永遠解決您的問題。正如其他人所提到的,在java命令行上使用-Xmx和/或-Xms。

您可以嘗試的下一件事是使用不同的JSON庫。也許你現在使用的一個不適合大型的JSON對象。或者可能有更新的版本。

作爲最後一招,你總是可以自己構建JSON。這畢竟是一個字符串,並且你已經有了內存中的數據。爲了儘可能高效,你甚至不需要一次構建整個字符串,你可以繼續寫下你的BufferedWriter。