一般来说Json文件都相对比较小,但是盖不住有些变态的需求中,Json的文件简直大到让你发指,那如果遇到超大Json解析的时候,我们又该如何解决呢?今天就给大家分享一种,可以利用极低的内存,就可以解析任意大小的Json文件的方法。
一、准备大Json文件
在win10系统E盘目录下,准备一个接近400M的超级大Json文件(gz压缩包解压之后的文件大小),如下图所示:
在IDEA中,我们将运行类的VM参数设置为10M,如下图所示:
二、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);
结果赤裸裸的打脸了,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);
结果很喜人,Gson成功的在10M的内存下,成功的解析了400M的Json文件数据,我们看看JVM监控工具中显示的内存是多少。
我们从图中可以看到,通过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](https://img-blog.csdnimg.cn/img_convert/77e6fab09841ebc26f5191fcbe4849ec.png)
![0b162999ead50beca9f42c98b49c4b0c.gif](https://img-blog.csdnimg.cn/img_convert/0b162999ead50beca9f42c98b49c4b0c.gif)
觉得好看,请点这里↓↓↓