快速及;在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);