快速及;在Java中逐行读取大型JSON文件的有效方法
我在快速及;在Java中逐行读取大型JSON文件的有效方法,java,performance,file-io,java.util.scanner,bufferedreader,Java,Performance,File Io,Java.util.scanner,Bufferedreader,我在JSON文件中有1亿条记录,需要一种高效、最快的方法从java中的JSON文件读取数组 JSON文件看起来像: [["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"], ["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"], ... ... ... ,["XYZ",...,"ABC"],[
JSON
文件中有1亿条记录,需要一种高效、最快的方法从java
中的JSON
文件读取数组
JSON
文件看起来像:
[["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
...
...
...
,["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"]]
我想逐行阅读此JSON
文件,如下所示:
首先阅读:
["XYZ",...,"ABC"]
然后:
等等:'
...
...
...
["XYZ",...,"ABC"]
如何读取像这样的JSON
文件,我知道它不完全像JSON
文件,但我需要以这种格式读取此文件,该格式保存为.JSON,您可以使用它以流式方式处理数据:
import javax.json.Json;
import javax.json.stream.JsonParser;
...
String dataPath = "data.json";
try(JsonParser parser = Json.createParser(new FileReader(dataPath))) {
List<String> row = new ArrayList<>();
while(parser.hasNext()) {
JsonParser.Event event = parser.next();
switch(event) {
case START_ARRAY:
continue;
case VALUE_STRING:
row.add(parser.getString());
break;
case END_ARRAY:
if(!row.isEmpty()) {
//Do something with the current row of data
System.out.println(row);
//Reset it (prepare for the new row)
row.clear();
}
break;
default:
throw new IllegalStateException("Unexpected JSON event: " + event);
}
}
}
import javax.json.json;
导入javax.json.stream.JsonParser;
...
字符串dataPath=“data.json”;
try(JsonParser=Json.createParser(新文件读取器(数据路径))){
列表行=新的ArrayList();
while(parser.hasNext()){
JsonParser.Event事件=parser.next();
开关(事件){
案例开始\u阵列:
继续;
大小写值\u字符串:
add(parser.getString());
打破
案例结束单元阵列:
如果(!row.isEmpty()){
//对当前数据行执行某些操作
系统输出打印项次(行);
//重置它(为新行做准备)
row.clear();
}
打破
违约:
抛出新的IllegalStateException(“意外JSON事件:+事件”);
}
}
}
您可以使用JsonPath:$[*]提取所有内部JSON数组
JsonSurfer surfer = JsonSurferJackson.INSTANCE;
surfer.configBuilder().bind("$[*]", new JsonPathListener() {
@Override
public void onValue(Object value, ParsingContext context) {
System.out.println(value);
}
}).buildAndSurf(json);
它不会将整个Json加载到内存中。JSON数组将逐个处理 你是说JSON吗??或者我遗漏了什么?输入错误抱歉JSON。首先,文件应该在快速SSD上。接下来,您可以尝试使用
BufferedReader
读取它,看看这是否已经为您提供了SSD能够提供的最大速度。如果没有,请尝试FileChannel.map
并查看读取结果ByteBuffer的速度。顺便说一句,如果您想多次读取文件,请确保您的计算机中有足够的可用RAM,以允许操作系统在内存中缓冲整个文件。我声明了一个HashMap,并将行值放入HashMap,但如果我想在HashMap中获取值,它将返回一个空列表[]。这是由于row.clear()语句导致的。如何解决这个问题?@AAKM只需重新创建行,而不是清除它:row=new ArrayList()
(在END\u ARRAY块中)。您最好确保有足够的内存在一个巨大的HashMap.replace row.clear()行中存储1亿条记录,然后执行它,这需要花费大量时间。我使用hashmap来更高效地搜索数据,因此有任何其他方法来存储大量数据,并通过使用最小内存来高效搜索。@AAKM-这取决于您想对数据做什么,hashmap是可以的,只要您有足够的内存。
JsonSurfer surfer = JsonSurferJackson.INSTANCE;
surfer.configBuilder().bind("$[*]", new JsonPathListener() {
@Override
public void onValue(Object value, ParsingContext context) {
System.out.println(value);
}
}).buildAndSurf(json);