web-dev-qa-db-ja.com

Java)で大きなJSONファイルを1行ずつ読み取る高速で効率的な方法

JSONファイルに1億のレコードがあり、JSONJavaファイルから配列の配列を読み取るための効率的で最速の方法が必要です。

JSONファイルは次のようになります:

[["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
 ["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
 ...
 ...
 ...
 ,["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"]]

このJSONファイルを1行ずつ次のように読みたいと思います。

最初にお読みください:

["XYZ",...,"ABC"]

その後:

["XYZ",...,"ABC"]

など: '

...
...
...
["XYZ",...,"ABC"]

このようなJSONファイルを読み取るにはどうすればよいですか。完全にJSONファイルのようには見えませんが、.JSONとして保存されているこの形式でこのファイルを読み取る必要があります。

3
user7657960

JSON Processing API(JSR 353) を使用して、ストリーミング方式でデータを処理できます。

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);
         }
     }
}
5
zeppelin

Jackson StreamingAPIをご覧ください。

私はあなたがこのようなものを見ていると思います--- https://www.ngdata.com/parsing-a-large-json-file-efficiently-and-easily/

そしてこれ-- https://stackoverflow.com/a/24838392/814304

主なこと-大きなファイルがある場合は、ファイルを1つずつ読み取り、処理する必要があります。

2
iMysak

JsonSurfer を使用して、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配列は1つずつ処理されます。

1
Leo Wang