FastJson 读取超大json文件引起OOM问题排查与解决

本文介绍了在使用FastJson读取大型json文件时遇到的内存溢出(OOM)问题及其排查过程。通过MAT工具分析,发现大量HashMap和JSONObject实例未被回收,原因是FastJson的contextArray数组未及时清理。最终,通过修改代码,使用startObject单独解析key-value,成功解决了内存增长问题。
摘要由CSDN通过智能技术生成

背景

最近工作有一个需求,需要读取一个约2GB的json文件(存储了约3千万个json对象的集合),解析其中的每个json对象,并进行一些数据转换,最后把转换后的json对象存储到es中。json文件格式大概是这样的:

[
    {
   
        lng: 116.22
        lat: 22.00,
        count: xxxx
    },
    {
   
        lng: 116.22
        lat: 22.00,
        count: xxxx
    },
    ...
]

一次性将这个json文件加载到内存中进行json解析肯定是不行的,因此,我想到的是利用fastjson中的JSONReader流式读取文件逐步解析,快速看了一下JSONReader的API及demo,便开始coding,很快便写出了如下简化版的代码,fastjson 版本 1.2.70

    private final static int BATCH_SIZE = 20000;
    public int importDataToEs(String jsonPath) {
   
        int count = 0;
        List<JSONObject> items = new ArrayList<>(BATCH_SIZE);
        try (Reader fileReader = new FileReader(jsonPath)) {
   
            JSONReader jsonReader = new JSONReader(fileReader);
            jsonReader.startArray();
            while (jsonReader.hasNext()) {
   
                JSONObject object = (JSONObject) jsonReader.readObject();
                JSONObject item = processObject
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值