2014-07-19 3 views
0

안녕하세요. 약 1.6GB 크기의 하나의 대형 CSV 파일이 있습니다.이 파일을 읽고 json 배열을 만들어 다른 소모품 프로세스로 보내려고합니다.BufferedReader를 사용하여 파일에서 행 세트 읽기

내가 다음 코드를

while(consumeover){ 
    try (BufferedReader br = new BufferedReader(new FileReader 
           ("/my/path/largefile"),65536)) { 
     for (String line; (line = br.readLine()) != null;) { 
     String[] dataRow = line.split("\\|"); 
     //create json array 
     //add each dataRow element to array 
     } 
    } 
    } 

이 지금 무슨 일이 일어나고있는 코드가 전체 파일을 읽고 메모리 부족 오류가 발생 JSON 배열을 만듭니다 이상입니다. 나는 json 배열을 만들 때마다 1000 줄을 말하는 줄 집합을 읽고 싶다. 마지막으로 읽은 위치를 i + 1000으로 어떻게 설정합니까? 파일이 매우 거대하기 때문에 자바는 데이터 배열이 만들어지기 때문에 메모리를 낭비하고있다.

미리 감사드립니다.

답변

1

간단한 해결책은 얻은대로 각 줄을 출력하고 (배열에 저장하지 않고 보내기/쓰기) 각 줄을 가져 오면 1000 줄마다 출력하는 것입니다. 이렇게하면 한 번에 파일을 읽을 수 있습니다. 메모리에 저장하는 라인이 적을수록 메모리 사용량은 적어집니다.

참고 : N 줄에서 읽는 유일한 방법은 N 줄을 읽고 무시하는 것입니다. 파일이 커짐에 따라 점점 더 비싸 질 것입니다.

CSV 행을 JSon으로 변환하는 메소드가 있다고 가정 해보십시오.

try(BufferedReader br = new BufferedReader(new FileReader(infile)); 
    PrintWriter bw = new PrintWriter(new FileWriter(outfile))) { 
    for(String line; (line = br.readLine()) != null;) { 
     String json = process(line); 
     bw.println(json); 
    } 
} 

파일 크기에 관계없이 CSV 한 줄과 JSON 한 줄에 충분한 메모리가 필요합니다.

+0

안녕하세요 @Peter는 답변에 많은 감사를드립니다. 확장 될까요? 제가 매우 큰 파일을 가지고 있기 때문에 1.6G가 가장 작은 파일입니다. RandomAccessfile이 도움이됩니까? 필자는 File IO에 익숙하지 않아 무엇이 최선인지 모릅니다. – u449355

+0

왜 규모가 조정되지 않습니까? 1TB의 파일을 가질 수 있습니다. NIO가 어떻게 도움이되는지 알지 못합니다. –

+0

간단한 코드로 도와 주시면 접근 방법을 이해할 수 없습니다. – u449355

관련 문제