Производительность BufferReader.skip () - PullRequest
1 голос
/ 01 марта 2012

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

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 (). Но если значение смещения больше, то оно сильно различается (например, для 8 Гбайт различно для 2 ГБ), а в многопоточном приложении разница для одного и того же кода огромна (для смещения 2 Гб задержка составляет около 15-20 минут). Я не могу заменить BufferReader.skip () на FileInputStream.skip (), так как один принимает смещение в виде байтов, а другой - в виде символов. Для файла unicode он незаменим.

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

Заранее спасибо.

1 Ответ

1 голос
/ 01 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...