当前位置: 首页 > 面试题库 >

“ OutOfMemoryError:超出了GC开销限制”:使用java解析大型json文件

池砚文
2023-03-14
问题内容

我尝试使用Java解析大型json文件(更多600Mo)。我的json文件如下所示:

{
    "0" : {"link_id": "2381317", "overview": "mjklmklmklmklmk", "founded": "2015", "followers": "42", "type": "Gamer", "website": "http://www.google.com",  "name": "troll", "country": "United Kingdom", "sp": "Management Consulting" },
    "1" : {"link_id": "2381316", "overview": "mjklmklmklmklmk", "founded": "2015", "followers": "41", "type": "Gamer", "website": "http://www.google2.com",  "name": "troll2", "country": "United Kingdom", "sp": "Management Consulting" }
    [....]

    "345240" : {"link_id": "2381314", "overview": "mjklmklmklmklmk", "founded": "2015", "followers": "23", "type": "Gamer", "website": "http://www.google2.com",  "name": "troll2", "country": "United Kingdom", "sp": "Management Consulting" }
}

我的代码如下所示:

public class dumpExtractor {

    private static final String filePath = "/home/troll/Documents/analyse/lol.json";

    public static void main(String[] args) {

    try {
        // read the json file
        FileReader reader = new FileReader(filePath);
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
        Iterator<JSONObject> iterator = jsonObject.values().iterator();

        while (iterator.hasNext()) {
        JSONObject jsonChildObject = iterator.next();
        System.out.println("==========================");
        String name = (String) jsonChildObject.get("name");
        System.out.println("Industry name: " + name);

        String type = (String) jsonChildObject.get("type");
        if (type != null && !type.isEmpty()) {
            System.out.println("type: " + type);
        }

        String sp = (String) jsonChildObject.get("sp");
        if (sp != null && !sp.isEmpty()) {
            System.out.println("sp: " + sp);
        }
        System.out.println("==========================");
        }
        System.out.println("done ! ");
    } catch (IOException ex) {
        ex.printStackTrace();
    } 
    }
}

我遇到了这个错误:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.HashMap.createEntry(HashMap.java:897)
    at java.util.HashMap.addEntry(HashMap.java:884)
    at java.util.HashMap.put(HashMap.java:505)
    at org.json.simple.parser.JSONParser.parse(Unknown Source)
    at org.json.simple.parser.JSONParser.parse(Unknown Source)

我该如何解决?

提前致谢。


问题答案:

如果必须读取巨大的JSON文件,则无法在内存中保留所有信息。扩展内存可以解决1 Gb文件的问题。如果明天的文件是2 Gb文件?

解决此问题的正确方法是使用流解析器逐元素解析json元素。基本上,不需要读取整个json并创建一个表示它的大对象,而是需要读取json的单个元素并将它们逐步转换为对象。

在这里,您可以找到一篇不错的文章,其中介绍了如何使用杰克逊库进行操作。



 类似资料:
  • 使用当我尝试构建我的项目时,这种错误越来越多: 错误:任务“:app:CompiledEbugJavaWithJavac”执行失败。OutofMemoryError:超出GC开销限制 有什么办法解决这个问题吗?

  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同

  • 问题内容: 我在一个程序中创建了这个错误,该程序创建了几个(数十万)HashMap对象,每个对象都有几个(15-20)文本条目。这些字符串必须全部收集(不分解成较小的数量),然后再提交给数据库。 根据Sun的说法,该错误发生“如果在垃圾回收上花费了太多时间:如果在垃圾回收上花费了总时间的98%以上,而回收不到2%的堆,则将引发OutOfMemoryError。 ”。 显然,可以使用命令行将参数传递

  • 我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过 输入文件具有以下结构 这是我正在使用的代码: 基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。

  • 问题内容: 我收到 java.lang.OutOfMemoryError: 在Android 1.4上运行gradle时, 超出了GC开销限制 …这是我的依赖: 如何解决? 问题答案: 将此添加到您的android闭包(构建gradle): 这样可以解决您的问题。不过,如果您遇到问题,请参见以下链接 GC开销限制超出错误

  • 问题内容: 我执行JUnit测试时收到以下错误消息: 我知道是什么OutOfMemoryError,但是GC开销限制是什么意思?我该如何解决? 问题答案: 该消息表示由于某种原因,垃圾收集器占用了过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行时恢复的内存很少(默认为堆的2%)。 这实际上意味着你的程序停止任何进展,并且一直在忙于仅运行垃圾回收。 为了防止你的应用程序浪费CPU