3

JSON 파일에 100 만 개의 레코드가 있으므로 java에있는 파일 JSON에서 배열 배열을 효율적이고 신속하게 읽을 수있는 방법이 필요합니다.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"] 

등등 : '

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

내가 이런 JSON 파일을 읽을 어떻게, 나는 그것이 완전히 JSON 파일처럼 보이지 않는 것을 알고 있지만 다른 이름으로 저장 .JSON

입니다 형식으로이 파일을 읽을 필요 https://www.ngdata.com/parsing-a-large-json-file-efficiently-and-easily/

를이 - - 잭슨 스트리밍 API에 봐 주시기 바랍니다

+1

JSON을 의미합니까 ?? 또는 나는 무엇인가 놓치고 있냐? – DazstaV3

+0

타이핑 실수 JSON. –

+0

먼저 파일은 빠른 SSD에 있어야합니다. 다음으로'BufferedReader'를 사용하여 그것을 읽으면서 SSD가 제공 할 수있는 최대 속도를 이미 얻을 수 있는지 살펴볼 수 있습니다. 그렇지 않으면'FileChannel.map'을 시도하고 결과 ByteBuffer에서 얼마나 빨리 읽을 수 있는지보십시오. Btw. 파일을 두 번 이상 읽으려면 OS에서 전체 파일을 메모리에 버퍼링 할 수 있도록 사용 가능한 RAM이 충분한 지 확인하십시오. – SpiderPig

답변

3

당신은 스트리밍 방식으로 데이터를 처리 할 수 ​​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); 
     } 
    } 
} 
+0

HashMap을 선언하고 행 값을 HashMap에 넣지 만 HashMap에 값을 가져 오려면 빈 List []를 반환합니다. 이것은 row.clear() 문으로 인해 발생합니다. 이 문제를 해결하는 방법? –

+0

@AAKM'row = new ArrayList <>()'(END_ARRAY 블록에 있음)을 지우는 대신 행을 다시 작성하십시오. 거대한 HashMap에 1 억 개의 레코드를 저장할 수있는 충분한 메모리가 있는지 확인하는 것이 좋습니다. – zeppelin

+0

row.clear() 행을 대체하고 많은 시간이 걸리는 행을 실행하십시오. 해시 맵을 사용하여 데이터를보다 효율적으로 검색하므로 거대한 데이터를 저장하고 최소 메모리를 사용하여 효율적으로 검색하는 다른 방법이 있습니다. –

2

,

난 당신이 뭔가를 찾고있는 것 같아요 https://stackoverflow.com/a/24838392/814304

큰 파일이 있으면 게으른 파일을 읽고 처리해야합니다.

+0

친절하게 질문이 다시 업데이트됩니다. –

+0

스레드 "main"의 예외 java.lang.OutOfMemoryError : Java 힙 공간 –

+0

@AAKM 전체 파일을 메모리에로드하지 않고 BufferredReader를 사용하여 문자열을 분할하십시오. –

0

당신은 JsonPath 모든 내부 JSON 배열을 추출 할 JsonSurfer을 사용할 수 있습니다 : $ [*]

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 배열은 하나씩 처리됩니다.