2012-01-10 3 views
5

난 500000 행 conatins 파일을 읽고 있어요.다중 스레드로 단일 파일 읽기 : 속도가 빨라야합니까?

시작 시간 : 1326224619049

완료 시간 : 2 가 나는 결과 다음과 같은 얻을 = 1을 납입에 대한

private void multiThreadRead(int num){ 

    for(int i=1; i<= num; i++) { 
     new Thread(readIndivColumn(i),""+i).start(); 
    } 
} 

private Runnable readIndivColumn(final int colNum){ 
    return new Runnable(){ 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 

       long startTime = System.currentTimeMillis(); 
       System.out.println("From Thread no:"+colNum+" Start time:"+startTime); 

       RandomAccessFile raf = new RandomAccessFile("./src/test/test1.csv","r"); 
       String line = ""; 
       //System.out.println("From Thread no:"+colNum); 

       while((line = raf.readLine()) != null){ 
        //System.out.println(line); 
        //System.out.println(StatUtils.getCellValue(line, colNum)); 
       } 


       long elapsedTime = System.currentTimeMillis() - startTime; 

       String formattedTime = String.format("%d min, %d sec", 
         TimeUnit.MILLISECONDS.toMinutes(elapsedTime), 
         TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - 
         TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime)) 
        ); 

       System.out.println("From Thread no:"+colNum+" Finished Time:"+formattedTime); 
      } 
      catch (Exception e) { 
       // TODO Auto-generated catch block 
       System.out.println("From Thread no:"+colNum +"===>"+e.getMessage()); 

       e.printStackTrace(); 
      } 
     } 
    }; 
} 

private void sequentialRead(int num){ 
    try{ 
     long startTime = System.currentTimeMillis(); 
     System.out.println("Start time:"+startTime); 

     for(int i =0; i < num; i++){ 
      RandomAccessFile raf = new RandomAccessFile("./src/test/test1.csv","r"); 
      String line = ""; 

      while((line = raf.readLine()) != null){ 
       //System.out.println(line); 
      }    
     } 

     long elapsedTime = System.currentTimeMillis() - startTime; 

     String formattedTime = String.format("%d min, %d sec", 
       TimeUnit.MILLISECONDS.toMinutes(elapsedTime), 
       TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - 
       TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime)) 
      ); 

     System.out.println("Finished Time:"+formattedTime); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     // TODO: handle exception 
    } 

} 
    public TesterClass() { 

    sequentialRead(1);  
    this.multiThreadRead(1); 

} 

.... 어떻게 다중 스레드 속도까지 과정을보기 위해 테스트를하고 있습니다 분,

순차 읽기가 종료 14 초 ...........

멀티 스레드 읽기 시작 :

스레드에서 691,363,210

번호 : 1 시작 시간 : 스레드에서 1,326,224,753,606

번호 : 1 완료 시간 : 2 분,

멀티 스레드가 종료 읽기 13 초 .....

에 대한 NUM = 5 결과를 얻습니다.

formatted Time:10 min, 20 sec 

Sequential read ENDS........... 

Multi-Thread read starts: 

From Thread no:1 Start time:1326223509574 
From Thread no:3 Start time:1326223509574 
From Thread no:4 Start time:1326223509574 
From Thread no:5 Start time:1326223509574 
From Thread no:2 Start time:1326223509574 
From Thread no:4 formatted Time:5 min, 54 sec 
From Thread no:2 formatted Time:6 min, 0 sec 
From Thread no:3 formatted Time:6 min, 7 sec 
From Thread no:5 formatted Time:6 min, 23 sec 
From Thread no:1 formatted Time:6 min, 23 sec 
Multi-Thread read ENDS..... 

제 질문은 다음과 같습니다. 다중 스레드 읽기가 약 실행되지 않아야합니다. 2.13 초? 멀티 스레드 솔루션으로 왜 그렇게 오래 걸리는지 설명해 주시겠습니까?

미리 감사드립니다.

+0

[단일 파일을 읽는 Java 다중 스레드 응용 프로그램] 가능한 복제본 (http://stackoverflow.com/questions/8126277/java-multi-thread-application-that-reads-a-single-file) –

+0

스레딩은 다른 디스크에 쓰지 않는 한 작동하지 않습니다.이 경우 두 스레드가 동일한 파일에 쓰려고합니다. 따라서 스레딩은 해당 시나리오에서 작동하지 않습니다. –

+0

@TomaszNurkiewicz - 동일하지 않습니다. 파일 당 하나의 스레드를 사용하고있었습니다. –

답변

7

파일 읽기는 주로 디스크 기다리고 있기 때문에 I/O, 디스크는 본질적으로 일련 과정 인이 많은 스레드 :

+1

스레드/잠금 또한 해당 부분에 재생됩니까? – Bhushan

+0

아마도 I/O 잠금 전략은 Java 구현과 기본 운영 체제에 의존합니다. –

+0

동일한 사용 사례에 대한 테스트를 실행 중입니다. 여러 스레드에서 단일 파일을 읽는 중입니다. SAS 드라이브의 성능이 향상되는 동안 기본 스토리지가 SATA 디스크 드라이브 인 경우 다중 스레드를 사용하면 성능이 향상된다는 사실을 발견했습니다. 포인트 - 투 - 포인트 기술 때문일까요? 아니면 제 테스트가 잘못된 것을하고 있습니까? –

1

파일에서 읽기에 의해 사용되는해서 빨리 회전하지 않습니다 문제가 캐싱이 없다고 가정 할 때 파일에서 데이터를 검색하는 속도에 제한이 있음을 의미합니다. 파일 잠금 (즉, 파일을 읽기 전용으로 열기)이 없어도 첫 번째 이후의 모든 스레드가 디스크 읽기를 막을 것이므로 다른 모든 스레드를 대기 상태로 만들고 데이터가 사용 가능할 때 활성화되어있는 스레드를 처리합니다. 다음 블록.

5

병렬로 읽을 때 속도가 느린 이유는 마그네틱 하드 디스크 헤드가 각 스레드에 대해 다음 읽기 위치 (약 5ms 소요)을 검색해야하기 때문입니다. 따라서 복수 스레드를 사용하여 읽기 은 검색을 수행하는 동안 디스크를 바운스하고 속도를 늦 춥니 다. 단일 디스크에서 파일을 읽는 유일한 권장 방법은 하나의 스레드로 순차적으로 읽는 것입니다.

+0

의견을 보내 주셔서 감사합니다. 다중 쓰레드 읽기가 조금 더 시간이 걸린다.6.2 분 = 6.20 분), 순차 읽기 (즉, 순차 읽기 = 10.20 분, 5 스레드 = 6.20 분)로 5 회 반복하는 동안 4 분 5 초를 절약 할 수 있습니다. – Hasan

관련 문제