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();
}
}
}
最好使用提供了流媒體的API庫。請參閱http://stackoverflow.com/questions/444380/is-there-a-streaming-api-for-json –
@WW。是。我正在使用簡單的JSON。 – Viraj
爲什麼要將整個JSON對象加載到內存中,而不是將每個單獨的「JSONObject obj」寫入文件。你可以先寫每個obj寫之間的「[」,然後是「,」。讓我知道如果你想要一個如何這樣做的例子。另外,如果您需要將整個內存加載到內存中,您是否使用Xmx選項來增加內存堆 – faljbour