2012-07-03 6 views
0

나는 매우 큰 csv 파일이 있는데 평균을 얻는 일부 선택 쿼리를 사용해야합니다 ... 메모리가 부족하여 한 줄씩 읽음으로써 정상적으로 수행 할 수 없습니다.큰 csv 파일을 사용하는 방법

다음 코드는 짧은 csv 파일에서는 잘 작동하지만 거대한 코드에서는 제대로 작동하지 않습니다. 대용량 csv 파일 용으로이 코드를 편집 할 수 있으면 감사하겠습니다.

import java.io.File; 

import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class Mu { 
    public void Computemu() 
    { 
     String filename="testdata.csv"; 
     File file=new File(filename); 
     try { 
      Scanner inputstream=new Scanner(file);//Scanner read only string 
      // String data=inputstream.next();//Ignore the first line(header) 
      double sum=0; 
      double numberOfRating=0; 

      while (inputstream.hasNext()) 
      {      
       String data=inputstream.next();//get a whole line 
       String[] values= data.split(";");//values separate by; 
       double rating=Double.parseDouble(values[2].replaceAll("\"", ""));//change value to string 
       if(rating>0)//do not consider implicit ratings 
       { 
        sum+=rating; 
        numberOfRating++; 
       } 
      } 
      inputstream.close(); 
      System.out.println("Mu is"+ (sum/numberOfRating)); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+2

:.. 그것은 단지 –

+0

합니까 스캐너 부하 한 번에 메모리에 하나 개의 라인을 가지고 전체 파일을 먼저 메모리에 저장합니까? http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html –

답변

0

이 사용 사례에서는 Apache Commons FileUtil을 사용하는 것이 좋습니다. 이것은 당신의 질문에서 당신이 찾고있는 것은 아니지만 FileUtil을 사용하는 것이 다시 구현하는 것이 바람직합니다.

자세한 내용은 lineIterator 방법을 참조하십시오.

2

useDelimiter을 호출하지 않았으므로 next() 메서드는 전체 파일을 공백이 없으면 (기본 구분 기호) 문자열에로드해야합니다.

이로 인해 OutOfMemory 오류가 발생합니다.

스캐너를 사용하려면 필요에 따라 구분 기호를 설정하십시오.

그러나 CSV 라이브러리 (같은 csvfile 아마 더 효율적이 될 것입니다 위의 코드는 OutOfMemoryError가 발생할 왜 이해가 안

관련 문제