2016-04-24 73 views
0

我想用JSON解析大JSON文件簡單,並且出現內存錯誤。我在Windows 10上,筆記本電腦有8GB內存。該文件是250MB,我還需要解析一個2GB的文件。我也嘗試過使用StrinBuilder,但後來在StringBuilder上出現內存錯誤。這裏是我的代碼的StringBuilder:用JSON解析大JSON文件簡單(OutOfMemoryError)

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("myfile.json"))); 
    String line = null; 
    StringBuilder sb= new StringBuilder(""); 
    while((line = br.readLine())!= null){ 
     sb.append(line); 
    } 
    JSONParser parser = new JSONParser(); 
    Object obj=null; 
    try { 
     obj = parser.parse(sb.toString()); 
    }catch (Exception e) { 

    }  

,這裏是沒有的StringBuilder代碼:

JSONParser parser = new JSONParser(); 
     Object obj=null; 
     try { 
      obj = parser.parse(new FileReader("myfile.json")); 
     }catch (Exception e) { 

     }  

錯誤

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded at org.json.simple.parser.Yylex.yylex(Unknown Source) at org.json.simple.parser.JSONParser.nextToken(Unknown Source) at org.json.simple.parser.JSONParser.parse(Unknown Source) at org.json.simple.parser.JSONParser.parse(Unknown Source)

+0

這裏'StringBuilder'對象迭代過程中保存所有數據。以便文件中的所有內容都在內存中。您可以按照顯示如何閱讀大尺寸文件的鏈接進行操作。 http://stackoverflow.com/questions/2356137/read-large-files-in-java –

+2

我建議你使用事件驅動程序pasrer而不是將整個JSON加載爲DOM。這應該允許您處理更大的消息。 –

+0

@ataurRahmanMunna我嘗試了你所說的和StringBuilder是好的,但我在json解析器上再次出現內存不足錯誤。 –

回答

2

如果你是開放使用其他JSON分析器,那麼你可以嘗試傑克遜的Streaming API可用於解析巨大的JSON甚至千兆字節的大小。它可用於處理大型文件而無需加載它們完全memory.It可以得到你想要的數據,而忽略你不想要的東西也

瞭解更多:http://wiki.fasterxml.com/JacksonStreamingApi

+1

在問題評論中,我能夠在彼得的幫助下解決問題。這正是我最終使用的!不管怎麼說,還是要謝謝你!! –