使用 JSON 简单解析大型 JSON 文件(OutOfMemoryError)
Parse large JSON file with JSON Simple (OutOfMemoryError)
我正在尝试使用 JSON 简单解析大型 JSON 文件,但出现内存不足错误。我在 Windows 10,我的笔记本电脑有 8GB 内存。该文件是 250mb,我还需要解析一个 2gb 文件。我也尝试过使用 StrinBuilder,但后来我在 StringBuilder 上遇到内存错误。这是我使用 StringBuilder 的代码:
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)
如果您愿意使用其他 Json 解析器,那么您可以尝试 Jackson's Streaming API,它可用于解析巨大的 JSON 甚至千兆字节的 size.It 可用于处理大文件而无需在 memory.It 中完全加载它们允许获取您想要的数据并忽略您不想要的数据
阅读更多:https://github.com/FasterXML/jackson-docs/wiki/JacksonStreamingApi
有一些优秀的库可以用最少的资源解析大型 JSON 文件。一种是流行的GSON library。它将文件解析为流和对象的效果相同。它处理每条记录,然后丢弃流,保持低内存使用率。
支持任意复杂的对象(具有很深的继承层次结构和广泛使用泛型类型)
看看这个 Detailed Tutorial 的 GSON 方法,解决它的问题。
我正在尝试使用 JSON 简单解析大型 JSON 文件,但出现内存不足错误。我在 Windows 10,我的笔记本电脑有 8GB 内存。该文件是 250mb,我还需要解析一个 2gb 文件。我也尝试过使用 StrinBuilder,但后来我在 StringBuilder 上遇到内存错误。这是我使用 StringBuilder 的代码:
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)
如果您愿意使用其他 Json 解析器,那么您可以尝试 Jackson's Streaming API,它可用于解析巨大的 JSON 甚至千兆字节的 size.It 可用于处理大文件而无需在 memory.It 中完全加载它们允许获取您想要的数据并忽略您不想要的数据
阅读更多:https://github.com/FasterXML/jackson-docs/wiki/JacksonStreamingApi
有一些优秀的库可以用最少的资源解析大型 JSON 文件。一种是流行的GSON library。它将文件解析为流和对象的效果相同。它处理每条记录,然后丢弃流,保持低内存使用率。
支持任意复杂的对象(具有很深的继承层次结构和广泛使用泛型类型)
看看这个 Detailed Tutorial 的 GSON 方法,解决它的问题。