2012-01-10 13 views
5

500000 satırın geçtiği bir dosyayı okuyorum.Çoklu Konu ile tek bir dosyayı okuma: hızlandırmalı mı?

Başlangıç ​​saati:: 1326224619049

Biten Zaman: 2 Ben sonuç sonrasında olsun = 1 num için

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); 

} 

.... nasıl birden iplik hız işlemini görmek için test ediyorum dak,

Sıralı okuma BİTER 14 sn ...........

Çok Konuyu okumak başlar:

Konu Gönderen

no: 1 Başlangıç ​​saati: Konu Gönderen 1326224753606

no: 1 Bitmiş Zaman: 2 dk,

Çok Konuyu uçlarını okumak 13 sn .....

için num = 5 Ben sonuç sonrasında alıyorum:

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..... 

sorum şu: should çok kanallı okuma yaklaşık alır değil. 2.13 sn? Lütfen çok parçalı çözümle neden bu kadar uzun sürdüğünü açıklayabilir misiniz?

Şimdiden teşekkürler.

+0

olası yinelenen (http://stackoverflow.com/questions/8126277/java-multi-thread-application-that-reads-a-single-file) –

+0

Threading, farklı bir diske yazmadıkça çalışmaz, bu durumda her iki thread aynı dosyaya yazmaya devam eder. Bu nedenle, bu senaryoda iş parçacığı çalışmayacaktır. –

+0

@TomaszNurkiewicz - Aynı şey, dosya başına bir konu kullanıyordu. –

cevap

7

dosya okuma ağırlıklı diskin bekliyor beri I/O, disk doğası gereği seri süreçtir çok sayıda evreye :)

+1

İplik/kilitleme de içinde bir rol oynayacak mı? – Bhushan

+0

Muhtemelen, G/Ç kilitleme stratejisi, hem java uygulamasına hem de temel işletim sistemine bağlı olacaktır. –

+0

Aynı kullanım durumu için bir test yürütüyorum - birden çok ileti dizisinden tek bir dosyayı okuma. Birden fazla iş parçacığına sahip olmanın, temel depolama alanı SATA disk sürücüsü ise performansı artırırken, bir SAS sürücüsüyse performansı artırdığını buldum. Noktadan noktaya teknolojiden mi kaynaklanıyor yoksa benim testim yanlış bir şey mi yapıyor? –

1

bir dosyadan okunması tarafından kullanılır sırf daha hızlı dönmeye olmaz sorun var Önbelleğe alma olmadığı varsayılarak, bir dosyadan ne kadar hızlı veri alabileceğinize dair bir sınır vardır. Dosya kilitleri olmasa bile (yani dosyanın salt okunur olması), 1. adımdan sonraki tüm mesajlar sadece okunan diski bloke eder, böylece diğer tüm thread'ları bekletirsiniz ve veri kullanılabilir hale geldiğinde etkin olanı işler. sonraki blok.

5

Paralel olarak okunurken yavaşladığınız nedeni, manyetik sabit disk kafasının her iş parçacığı için bir sonraki okuma konumu olan (5 ms alma) aramasının gerekmesidir. Böylece, çoklu thread'lar ile okumak, diski arayışı arasında yavaşlatır ve yavaşlatır. Bir dosyayı tek bir diskten okumak için önerilen tek yol, bir iş parçacığı ile art arda okumaktır. [Tek dosyasını okur Java multi-thread uygulaması] ve

+0

Yorumlarınız için teşekkür ederiz. Karışık iş parçacıklı okuma biraz daha zaman alsa bile (ör.Sıralı okuma ile 5 kez iterating ederken hala, ben 5 dakika dakika 6,2) kaydedebilirsiniz, (yani ardışık okuma = 10.20 dakika; 5 iş parçacığı = 6.20 dakika) – Hasan

İlgili konular