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

Java 如何修复导入大型JSON文件时内存不足的问题,java,json,Java,Json,我想导入一个大小为5 GB的JSON文件,但它显示内存不足错误。 我通过放置-Xmx7700m-Xms7700m-XX:+UseConMarkSweepGC设置JVM,知道我的计算机中有8GB的RAM,但程序执行需要45分钟,然后显示此错误: 我使用的是maven Dependency“com.googlecode.json simple”版本:1.1.1 线程“main”java.lang.OutOfMemoryError中出现异常:GC开销 超出限制java.lang.OutOfMemory

我想导入一个大小为5 GB的JSON文件,但它显示内存不足错误。 我通过放置
-Xmx7700m-Xms7700m-XX:+UseConMarkSweepGC
设置JVM,知道我的计算机中有8GB的RAM,但程序执行需要45分钟,然后显示此错误: 我使用的是maven Dependency“com.googlecode.json simple”版本:1.1.1

线程“main”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文件分成几个部分,然后逐部分导入?

假设您的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();

你不认为使用什么JSON解析器很重要吗?!换句话说:请告诉我们您使用的是哪个库/工具,以及哪个版本。尝试将5GB文件加载到内存中是一种糟糕的设计。您应该研究支持流式api的解析器。除此之外,您还应该研究您的需求。你真的希望所有这些5GB的JSON同时出现在内存中,还是解析/处理/转换会更好。。。这些数据在“更小”的垃圾中?记录在案:一个5GB的JSON文件。。。听起来很奇怪。如果你有8G,你就不能用7.7G来堆。很可能计算机正在交换。另外,在解析5G文件时,可能需要7G以上的数据才能将其保存在内存中。您需要使用流媒体解决方案,否则您将需要获得更多RAM@幽灵猫我把它放到问题里了
// 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();
}