2012-03-01 2 views
1

Я вижу огромную разницу в производительности между двумя программами.BufferReader.skip() performance

import java.io.*; 
import java.util.Date; 

class SkipProg2 { 

    public static void main (String args[]) { 

     System.out.println (" File Reading "+ args.length); 
     System.out.println (" 1st Arg "+ args[0]); 
     System.out.println (" 2nd Arg "+ args[1]); 
     try { 
      FileInputStream fis = new FileInputStream(args[0]); 

      System.err.println("Time before skip : " + new Date()); 

      Long off = Long.parseLong(args[1]); 

      fis.skip (off); 
      System.err.println("Time After skip : " + new Date()); 


      InputStreamReader isr = new InputStreamReader(fis); 
      BufferedReader br = new BufferedReader(isr); 

      } // end try 
      catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 
    } // end main 

} 

И

import java.io.*; 
import java.util.Date; 

class SkipProg { 

    public static void main (String args[]) { 

     System.out.println (" File Reading "+ args.length); 
     System.out.println (" 1st Arg "+ args[0]); 
     System.out.println (" 2nd Arg "+ args[1]); 
     try { 
      FileInputStream fis = new FileInputStream(args[0]); 

      InputStreamReader isr = new InputStreamReader(fis); 
      BufferedReader br = new BufferedReader(isr); 

      System.err.println("Time before skip : " + new Date()); 
      Long off = Long.parseLong(args[1]); 

      br.skip (off); 
      System.err.println("Time After skip : " + new Date()); 
      } // end try 
      catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 
    } // end main 

} 

Одно использование FileInputStream.skip(), а другой BufferReader.skip(). Но, если значение смещения больше, то существует огромное различие (для Ex. 8 Secs по-разному для 2 ГБ) и в многопоточном приложении разница для одного и того же кода огромна (для смещения 2 Gb существует задержка в 15-20 минут). Я не могу заменить BufferReader.skip() с FileInputStream.skip(), поскольку каждый принимает смещение в байтах и ​​другой в терминах символов. Для файла unicode он незаменим.

Первый вопрос, является ли мое предположение правильным? какие предложения?

Спасибо заранее.

+0

Это 8 секунд на 2 Гб и 15 -20 минут, если у вас много потоков, делающих то же самое? Предполагая, что вы стареете вращающимися носителями, чтение нескольких файлов сразу приведет к тому, что голова будет искажаться повсюду, что не очень удобно для производительности. –

ответ

1

Пропуск для байтов может пропустить это количество байтов без их прочтения.

Пропуск для символов должен читать все символы/байты до этой точки, чтобы найти, где находится символ N.

Я удивлен, что требуется 15-20 минут для чтения 2 ГБ текста. Я ожидал бы ближе к 20 секундам. Какое оборудование у вас есть?

Если вы хотите, случайный доступ в текстовом файле, необходимо сохранить индекс номер строки в байт месте (таким образом время, затраченное будет делать ставку то же самое)