2015-04-15 40 views
4

將JSON對象存儲到文件時,我總是收到Java heap space錯誤。輸入文件是180 MB。我正在創建一個由JSON對象的JSON數組組成的JSON對象。處理不太大的文件時,我總是遇到這個錯誤。
將這些對象存儲到文件的最佳方法是什麼?將大型JSON對象存儲到java文件中?

public class ProcessData { 

    public static void createJson(String path) throws Exception 
    { 
     BufferedReader br = new BufferedReader(new FileReader(path)); 
     FileWriter fw = new FileWriter("restaurants.json"); 

     try 
     { 
      JSONObject storeObj = new JSONObject(); 
      JSONArray restaurantArray = new JSONArray(); 

      String line; 
      StringBuilder sb = new StringBuilder(); 

      while ((line = br.readLine()) != null) 
      { 
       JSONObject obj = new JSONObject(); 
       String[] vals = line.split("\\t"); 
       obj.put("id", vals[0]); 
       String[] tempvals = vals[1].split("\\|"); 
       String[] details = tempvals[0].split(","); 

       obj.put("name", details[0]); 
       sb.setLength(0); 
       sb.append(details[2]); 
       sb.append(", "); 
       sb.append(details[3]); 
       sb.append(", "); 
       sb.append(details[1]); 
       sb.append(", "); 
       sb.append(details[4]); 

       String address = sb.toString(); 
       address.replace("\\s+", " "); 
       obj.put("address", address); 
       JSONArray arr = new JSONArray(); 

       for (int i = 0; i < tempvals.length; ++i) 
       { 
        JSONObject objtemp = new JSONObject(); 
        details = tempvals[i].split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

        objtemp.put("inspectionDate", details[7]); 
        objtemp.put("code", details[9]); 
        objtemp.put("description", details[10]); 
        objtemp.put("score", details[12]); 
        objtemp.put("grade", details[13]); 
        objtemp.put("gradeDate", details[14]); 
        arr.add(objtemp); 
       } 
       obj.put("violationDetails", arr); 
       restaurantArray.add(obj); 
      } 
      storeObj.put("restaurants", restaurantArray); 
      fw.write(storeObj.toString()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      fw.flush(); 
      fw.close(); 
      br.close(); 
     } 
    } 

    public static void main(String args[]) throws Exception { 
     try{ 
     createJson("output/part-r-00000"); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

最好使用提供了流媒體的API庫。請參閱http://stackoverflow.com/questions/444380/is-there-a-streaming-api-for-json –

+0

@WW。是。我正在使用簡單的JSON。 – Viraj

+4

爲什麼要將整個JSON對象加載到內存中,而不是將每個單獨的「JSONObject obj」寫入文件。你可以先寫每個obj寫之間的「[」,然後是「,」。讓我知道如果你想要一個如何這樣做的例子。另外,如果您需要將整個內存加載到內存中,您是否使用Xmx選項來增加內存堆 – faljbour

回答

1

我曾嘗試與您的功能刪除克里特島的JSONObject部分和手動創建JSON字符串並將它寫入直接無緩衝到文件到您的對象。

下面是你的函數的更新的代碼:

public static void createJson(String path) throws Exception 
{ 
    BufferedReader br = new BufferedReader(new FileReader(path)); 
    FileWriter fw = new FileWriter("restaurants.json"); 
    try 
    { 
     String line; 
     StringBuilder sb = new StringBuilder(); 

     fw.write("{\"restaurants\":"); 
     line = br.readLine(); 
     while (line != null) 
     { 
      fw.write("[{"); 
      String[] vals = line.split("\\t"); 

      fw.write("{"); 
      fw.write("\"id\":\""+vals[0]+"\","); 

      String[] tempvals = vals[1].split("\\|"); 
      String[] details = tempvals[0].split(","); 

      fw.write("\"name\":\""+details[0]+"\","); 

      sb.setLength(0); 
      sb.append(details[2]); 
      sb.append(", "); 
      sb.append(details[3]); 
      sb.append(", "); 
      sb.append(details[1]); 
      sb.append(", "); 
      sb.append(details[4]); 

      String address = sb.toString(); 
      address.replace("\\s+", " "); 

      fw.write("\"address\":\""+address+"\","); 

      fw.write("\"violationDetails\":["); 
      StringBuilder sbStr = new StringBuilder(); 
      for (int i = 0; i < tempvals.length; ++i) 
      { 
       details = tempvals[i].split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 

       sbStr.append("{"); 
       sbStr.append("\"inspectionDate\":\""+details[7]+"\","); 
       sbStr.append("\"code\":\""+details[9]+"\","); 
       sbStr.append("\"description\":\""+details[10]+"\","); 
       sbStr.append("\"score\":\""+details[12]+"\","); 
       sbStr.append("\"grade\":\""+details[13]+"\","); 
       sbStr.append("\"gradeDate\":\""+details[14]+"\","); 
       sbStr.append("},"); 
      } 
      if(tempvals.length>0) 
       sbStr.substring(0, sbStr.length()-1); 

      fw.write(sbStr.toString()+"]"); 

      line = br.readLine(); 
      if(line != null) 
       fw.write("}],"); 
      else 
       fw.write("}]"); 
     } 
     fw.write("}"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     fw.flush(); 
     fw.close(); 
     br.close(); 
    } 
} 

我還沒有與真正的輸入文件數據的檢查,請與您的正確性檢查。

我希望這能解決您的問題。

可能在文件的JSON輸出是這樣的:

{ 「餐館」: { 「ID」: 「ID」, 「名」: 「名字」, 「地址「: 「地址」, 「violationDetails」:[ { 「inspectionDate」: 「details7」, 「代碼」: 「details9」, 「描述」: 「details10」, 「得分」: 「details12」, 「grade」:「details13」, 「gradeDate」: 「details14」 } ] } ]}