导入大型JSON文件时如何修复内存不足

时间:2019-05-07 08:38:25

标签: java json

我想导入5 GB大小的JSON文件,但是它显示了一个Out of memory错误。 我通过放置-Xmx7700m -Xms7700m -XX: + UseConcMarkSweepGC来设置JVM,因为我知道我的计算机中有8 GB RAM,但是程序执行需要45分钟,然后显示此错误: 我正在使用Maven流行性“ com.googlecode.json-simple”版本:1.1.1

  

线程“主”中的异常java.lang.OutOfMemoryError:GC开销   超出限制java.lang.OutOfMemoryError:Java堆空间//如果我放   -Xmx5000m -Xms5000m

这是导入JSON文件的代码

 JSONParser parser = new JSONParser();

    try {
        Object obj = parser.parse(new FileReader("url.json"));

        JSONObject jsonObject =  (JSONObject) obj;
        System.out.println(jsonObject);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }

我可以找到另一种解决方案来将JSON文件分为多个部分并逐个导入吗?

2 个答案:

答案 0 :(得分:1)

假设您的JSON文件是一大堆JSON对象,这可以为您提供帮助吗?:

import com.google.gson.stream.JsonReader;
import org.json.simple.JSONObject;
...


  JsonReader jsonReader = new JsonReader(new InputStreamReader(new FileInputStream(theFile), StandardCharsets.UTF_8));
  jsonReader.beginArray();
  Gson gson = new GsonBuilder().create();
  while (jsonReader.hasNext()) {
       JSONObject currentJsonObject = gson.fromJson(jsonReader, JSONObject.class);
        // do stuff
   }
   jsonReader.close();

答案 1 :(得分:0)

// Create a mapper model class according with your JSON file fields. I gave an example.   
public class JsonToJavaObject {

    @SerializedName("Id")
    @Expose
    private Integer id;

    @SerializedName("Name")
    @Expose
    private String name; 

   // Getter/Setter
}

// Create file from your JSON
File file = new File("url.json"); // Make sure your file name and location

// Make an input stream for the file's data
BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
InputStreamReader inputStreamReader = new InputStreamReader(buf, StandardCharsets.UTF_8);

// Read stream of data
try (JsonReader jsonReader = new JsonReader(inputStreamReader)) {
     Gson gson = new GsonBuilder().create();
     // Create JSON object
     JsonToJavaObject = gson.fromJson(jsonReader, JsonToJavaOnline.class);
} catch (Exception e) {
   e.getMessage();
}