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

2023-12-06

我尝试用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 的单个元素并逐步将它们转换为对象。

Here你会发现一篇很好的文章解释了如何使用杰克逊库来做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“OutOfMemoryError:超出GC开销限制”:用java解析大json文件 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 您是否需要两个表单字段来与 HTML 匹配?

    有没有办法要求两个表单字段中的条目使用 HTML 进行匹配 或者这仍然需要用 JavaScript 来完成 例如 如果您有两个密码字段 并且想要确保用户在每个字段中输入了相同的数据 是否可以使用一些属性或其他编码来实现此目的 不完全是 HT
  • 强制在 Android 上的 Soundcloud 应用程序中打开 Soundcloud 曲目

    我有一个链接到 Soundcloud 曲目的移动应用程序 在 Android 上 单击这些链接会弹出一个对话框 要求用户 使用浏览器或 Soundcloud 应用程序完成操作 有没有办法绕过这个屏幕 只在 Soundcloud 播放器中播放
  • 如何使用 2 组件选择器和文本字段输入在 Xcode 中编写计算代码

    我正在尝试对 iPhone iPad 屏幕进行编码 该屏幕根据文本字段中输入的内容以及 2 组件选择器中选择的内容输出值 我已经完成了基础知识 直到显示输入 选择的数据为止 但缺少执行计算 我搜索了我能找到的所有资源 并利用了我找到的所有相
  • MATLAB 排除超出 1 个标准差的数据

    我对 MATLAB 缺乏经验 很抱歉新手问题 我有一个大向量 905350 个元素 其中存储了一大堆数据 我有标准差和平均值 现在我想删除高于 低于平均值一个标准差的所有数据点 我只是不知道怎么做 根据我收集的信息 我必须做某种双循环 就像
  • 如何删除mongodb中的数组元素?

    这是数组结构 contact phone number 1786543589455 place New Jersey createdAt number 1986543589455 place Houston createdAt 这里我只知道
  • 导入错误:没有名为 PyMesh 的模块

    我已经尝试安装pymesh在 Mac OS 和 Windows 上 通过下载源代码并使用python setup py install 如中所述https github com qnzhou PyMesh 在这两种情况下 当我运行测试代码时
  • 将托管 dll 注入本机进程

    我正在尝试将托管 c dll 注入本机可执行文件中 我将以下代码注入到可执行文件中以加载 CLR 我知道注入有效 因为当我将代码注入 cmd exe 时 它 会正确输出 我知道CLRCreateInstance pMetaHost gt G
  • 反转音频文件 Swift/Objective-C

    有没有办法可以反转并导出 m4a 音频文件 我找到了反转音轨的解决方案here 但它似乎只适用于 caf 文件格式 如果唯一的方法是使用 caf 是否有办法先将 m4a 文件转换为 caf Update In 另一个帖子我发现 AVAsse
  • 将 VBA 数组元素输出到 Excel 中的一个单元格

    所以我有一个 vba 代码 它创建一个包含多个元素的数组 我想将这些元素输出到 Excel 的一个单元格中 我能够将其元素输出到多个单元格 但更喜欢在一个单元格中输出 这可以做到吗 如果数组被声明为 String 或 Variant 那么你
  • 替换借用的变量[重复]

    这个问题在这里已经有答案了 我有一桶需要积累价值的对象 它受到保护RwLock 因此我也保留它的写锁 我想在该过程期间保留单个写锁 例如 use std sync RwLock fn main let locked RwLock new V
  • 膨胀类和 android.support.v7.widget.CardView 时出错

    我想在我的项目中使用 CardView 但是当我运行我的应用程序时 出现以下错误 我在用着Eclipse Error Error inflating class and android support v7 widget CardView
  • 添加元素动态后的 JQuery 绑定事件

    动态添加元素后遇到问题 它没有单击事件 因此我有以下问题 myclass gt li click function 所以基本上当我点击 LI 元素时应该会发生一些事情并且它可以工作 但是当我向 myclass 添加一个新的 LI 元素 即
  • AudioInputStream() 不会停止

    我已使用以下命令将背景音频插入到我的程序中AudioInputStream 当我按下On 将播放背景音频 并且Off将停止播放背景音频 这是我的音频播放部分代码的部分 public void playSound int i try Othe
  • 删除表(如果存在)

    我有以下 PL SQL declare i cnt number begin select count 1 into i cnt from dba tables where table name upper foo and owner up
  • Kendo UI 网格始终从第 0 页开始

    我有一个 Kendo UI 网格 它总是从 0 开始 如果我更改列的排序 则它会变为 1 并显示其他页码 我究竟做错了什么 这是我的代码 userGrid kendoGrid dataSource pageSize 5 transport
  • 如何不按频率对 SOLR 拼写检查建议进行排序?

    如果您搜索ahve在我的分期索引上你得到the作为第一个拼写检查更正 因为the出现超过have在索引中 我索引了 500 个文档 如果您搜索ahve在我的本地索引上你得到have作为第一个拼写检查更正 因为have比索引中任何其他单词出现
  • 是否有相当于 PHP 的“父级”的 javascript 原型继承?

    我正在使用原型继承 我想在基类上调用重写的方法 在 PHP 中 我可以使用 Parent functionName 来做到这一点 使用 JavaScript 原型继承可以实现这一点吗 考虑以下示例 var A function this d
  • 为什么我在java中的布尔测试总是失败?

    我正在尝试进行布尔测试 以便如果其中一个轮胎压力低于 35 或高于 45 系统会输出 充气不良 在我的课堂上 我必须使用布尔值 这就是我尝试过的 但是返回的布尔值始终为 true 我不明白为什么 public class tirePress
  • MD5 文件哈希 - 将 Delphi 输出与 PHP md5_file 函数匹配

    我目前在 Delphi 7 中使用此代码进行 md5 散列 function MD5 const fileName string string var idmd5 TIdHashMessageDigest5 fs TFileStream b
  • “OutOfMemoryError:超出GC开销限制”:用java解析大json文件

    我尝试用Java解析大型json文件 超过600Mo 我的json文件看起来像这样 0 link id 2381317 overview mjklmklmklmklmk founded 2015 followers 42 type Game