2012-01-10 2 views
5

Я читаю файл, который содержит 500000 строк. Я проверяю, чтобы увидеть, как несколько скорости потоков процесса ....Чтение одного файла с несколькими потоками: нужно ускорить?

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

} 

для Num = 1 я получаю следующий результат:

Время старта: 1326224619049

Закончено Время: 2 мин, 14 сек

Последовательное считывание КОНЧАЕТСЯ ...........

многопоточной чтения начинается:

От Тема №: 1 Время начала: 1326224753606

От Тема №: 1 Закончено Время: 2 мин, 13 сек

Multi-Thread чтения ENDS .....

для 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

Threading не работает, если они не записываются на другой диск, в этом случае оба потока борются за запись в один и тот же файл. Следовательно, потоки не будут работать в этом сценарии. –

+0

@ TomaszNurkiewicz - Не то же самое, что один использует один поток для каждого файла. –

ответ

7

Поскольку чтение файла в основном ждет дискового ввода/вывода, у вас есть проблема, что диск не будет вращаться быстрее, только потому, что он используется многими нитями :)

+1

Будут ли в нем участвовать нитки/блокировки? – Bhushan

+0

Возможно, стратегия блокировки ввода-вывода будет зависеть как от реализации java, так и от базовой операционной системы. –

+0

Я выполняю тест для одного и того же варианта использования - чтение одного файла из нескольких потоков. Я обнаружил, что наличие нескольких потоков улучшает производительность, если базовое хранилище является диском SATA, а также улучшает производительность, если его диск SAS. Будет ли это из-за технологии «точка-точка» или мой тест сделает что-то неправильное? –

1

Чтение из файла по своей природе является последовательный процесс , не предполагая кеширования, то есть существует ограничение на то, как быстро вы можете извлекать данные из файла. Даже без блокировок файлов (т. Е. Открытие файла только для чтения) все потоки после 1-го будут просто блокироваться на диске, чтобы вы делали все остальные потоки ожидающими, и в зависимости от того, какой из них активен, когда становятся доступными данные, это тот, который обрабатывает следующий блок.

5

Причина, по которой вы наблюдаете замедление при параллельном считывании, заключается в том, что магнитная головка жесткого диска должна искать следующую позицию считывания (занимает около 5 мс) для каждой нити. Таким образом, чтение с несколькими потоками эффективно отскакивает диск между изображениями, замедляя его. Единственным рекомендуемым способом чтения файла с одного диска является чтение последовательно одним потоком.

+0

Спасибо за ваши комментарии. Несмотря на то, что чересстрочное чтение занимает больше времени (например.6,2 мин, а не 2,10 мин), но я могу сохранить 4/5 минут, пока я повторяю 5 раз с последовательным чтением (т. Е. Последовательное чтение = 10,20 мин, где в качестве 5 потоков = 6,20 мин) – Hasan

Смежные вопросы