使用JSON Simple解析大型JSON文件(OutOfMemoryError)

时间:2016-04-24 09:21:25

标签: java json jvm out-of-memory json-simple

我正在尝试使用JSON Simple解析大型JSON文件,并且我遇到了内存错误。我在Windows 10上,我的笔记本电脑有8GB RAM。该文件是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) {

        }    

错误

  

线程“main”中的异常java.lang.OutOfMemoryError:超出了GC开销限制       在org.json.simple.parser.Yylex.yylex(未知来源)       在org.json.simple.parser.JSONParser.nextToken(未知来源)       在org.json.simple.parser.JSONParser.parse(未知来源)       在org.json.simple.parser.JSONParser.parse(未知来源)

2 个答案:

答案 0 :(得分:2)

如果您打开使用其他Json解析器,那么您可以尝试 Jackson的Streaming API,它可用于解析甚至千兆字节大小的巨大JSON。它可用于处理大型文件而无需将它们完全加载到内存中。它允许获取您想要的数据并忽略您不想要的内容

了解详情:http://wiki.fasterxml.com/JacksonStreamingApi

答案 1 :(得分:0)

有一些优秀的库,可以用最少的资源来解析大型JSON文件。一种是流行的GSON library。它具有与解析流和对象一样的解析文件的效果。它会处理每条通过的记录,然后丢弃该流,从而保持较低的内存使用率。

支持任意复杂的对象(具有深层次的继承层次结构和泛型类型的广泛使用)

请查看此Detailed Tutorial中的GSON方法,以解决该问题。