版式文件 流式文件_10M内存读取400M JSON文件的骚操作!!!

一般来说Json文件都相对比较小,但是盖不住有些变态的需求中,Json的文件简直大到让你发指,那如果遇到超大Json解析的时候,我们又该如何解决呢?今天就给大家分享一种,可以利用极低的内存,就可以解析任意大小的Json文件的方法。

b555beffc8c58157fba0eddc1254936e.png

一、准备大Json文件

在win10系统E盘目录下,准备一个接近400M的超级大Json文件(gz压缩包解压之后的文件大小),如下图所示:

90b0348633535b110cc4224706cf3e4e.png

在IDEA中,我们将运行类的VM参数设置为10M,如下图所示:

799d993d6f866c8514cd313f487cbdd1.png

二、FastJson流式解析

我们先来看看阿里巴巴的FastJson流式解析是否能在10M的内存下面,解析完全部的Json文件数据,代码如下所示:

FileInputStream fileInputStream = new FileInputStream("E:/home/data/advertisement/report/2020-04-07/3680_700_us_2020-03-25_keywords_941640770740289536.gz");
GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);
InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream);
ArrayList objectList = new ArrayList<>();
int count = 0;
JSONReader reader = new JSONReader(inputStreamReader);
reader.startArray();
while (reader.hasNext()) {
Object message = reader.readObject();
count++;
objectList.add(message);
if (objectList.size() % 1000 == 0) {
// 省略业务处理代码
System.out.println(objectList.size());
// 清空list集合,防止内存溢出
objectList.clear();
}
}
reader.endArray();
reader.close();
System.out.println(count);

4a3e9842d472143bfc6d55dad334e376.png

结果赤裸裸的打脸了,FastJson的流式解析并不能解析成功,所以只能pass掉了。

三、Gson流式解析

我们接着来看Google的Gson是否能在10M内存下,完美的解析400M的Json文件数据,代码如下所示:

FileInputStream fileInputStream = new FileInputStream("E:/home/data/advertisement/report/2020-04-07/3680_700_us_2020-03-25_keywords_941640770740289536.gz");
GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream);
InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream);
JsonReader reader = new JsonReader(inputStreamReader);
ArrayList objectList = new ArrayList<>();
Gson gson = new Gson();
int count = 0;
try {
reader.beginArray();
while (reader.hasNext()) {
Object message = gson.fromJson(reader, Object.class);
count++;
objectList.add(message);
if (objectList.size() % 1000 == 0) {
// 省略业务处理代码
System.out.println(objectList.size());
// 清空list集合,防止内存溢出
objectList.clear();
}
}
reader.endArray();
objectList.clear();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(count);

4dfc0e9fa8d2c49dda0f01b0c7769361.png

结果很喜人,Gson成功的在10M的内存下,成功的解析了400M的Json文件数据,我们看看JVM监控工具中显示的内存是多少。

5ebf0cf399e38716ad2fb8754c646264.png

我们从图中可以看到,通过Gson的流式解析,几乎用不到10M的内存就可以完成大Json文件的解析。

四、时间花费

大家可能会觉得,Gson可以在那么小的内存下,解析那么大的Json文件,是不是以时间换空间,运行起来会特别慢,FastJson如果在内存够大的情况下,是不是解析时间会比Gson更快?

1.Gson解析时间

我们先来看一下在10M的内存下面,解析400M的Json文件需要多久的时间。

运行结果:

count:892785  time:10256

测试结果表面,在10M的内存,400M(892785行)的Json文件下,全部读取完数据需要10256(毫秒)的时间。

我们再来看一下,在4G的内存下,解析400M的Json文件又需要多久的时间。

运行结果:

count:892785  time:4088

测试结果表面,在10M的内存,400M(892785行)的Json文件下,全部读取完数据需要4088(毫秒)的时间。

2.FastJson解析时间

这边为了能让FastJson可以正常读取Json文件数据,博主特意将VM参数设置加大,这边博主将内存设置为4G,最后得出来的时间是:在400M(892785行)的Json文件下,全部读取完数据需要4512(毫秒)。

count:892785  time:4512

五、总结

从实验结果我们可以得出,如果是大Json文件,FastJson无法在小内存的情况下,进行数据解析,而Gson可以在小内存的情况下,完全解析Json文件,但是会耗费很长的时间。如果在内存相同的情况下,二者所花费的时间相差无几,所以如果二者之间进行选择的话,可以优先考虑Gson。

林老师带你学编程

微信号 : lzqcode

网址:wolzq.com

77e6fab09841ebc26f5191fcbe4849ec.png 0b162999ead50beca9f42c98b49c4b0c.gif

觉得好看,请点这里

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值