Подтвердить что ты не робот

Java Самый быстрый способ чтения текстового файла с 2 миллионами строк

В настоящее время я использую scanner/filereader и использую while hasnextline. Я думаю, что этот метод не очень эффективен. Есть ли другой способ читать файл с аналогичной функциональностью?

public void Read(String file) {
        Scanner sc = null;


        try {
            sc = new Scanner(new FileReader(file));

            while (sc.hasNextLine()) {
                String text = sc.nextLine();
                String[] file_Array = text.split(" ", 3);

                if (file_Array[0].equalsIgnoreCase("case")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("object")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("classes")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("function")) {
                    //do something
                } 
                else if (file_Array[0].equalsIgnoreCase("ignore")) {
                    //do something
                }
                else if (file_Array[0].equalsIgnoreCase("display")) {
                    //do something
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("Input file " + file + " not found");
            System.exit(1);
        } finally {
            sc.close();
        }
    }
4b9b3361

Ответ 1

Вы обнаружите, что BufferedReader.readLine() работает так же быстро, как вам нужно: вы можете прочесть миллионы строк в секунду. Более вероятно, что разделение и обработка строк вызывает любые проблемы с производительностью, с которыми вы сталкиваетесь.

Ответ 2

Сканер не может быть быстрым, так как сканер использует регулярное выражение для чтения текстового файла, что делает его медленнее по сравнению с буферизованным Reader. Используя bufferedReader(), вы можете прочитать блок из текстового файла.

BufferedReader bf = new BufferedReader(new FileReader("FileName"));

вы можете использовать readLine() для чтения из bf.

Надеюсь, что это ваша цель.

Ответ 3

вы можете использовать FileChannel и ByteBuffer от JAVA NIO. Размер ByteBuffer является наиболее важной частью для чтения данных быстрее, чем я наблюдал. Ниже код будет читать содержимое файла.

static public void main( String args[] ) throws Exception 
    {
        FileInputStream fileInputStream = new FileInputStream(
                                        new File("sample4.txt"));
        FileChannel fileChannel = fileInputStream.getChannel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        fileChannel.read(byteBuffer);
        byteBuffer.flip();
        int limit = byteBuffer.limit();
        while(limit>0)
        {
            System.out.print((char)byteBuffer.get());
            limit--;
        }

        fileChannel.close();
    }

Вы можете проверить '\n' для новой строки здесь. Спасибо.


Даже вы можете разбросать и получить способ быстрее читать файлы.

fileChannel.get(buffers);

где

      ByteBuffer b1 = ByteBuffer.allocate(B1);
      ByteBuffer b2 = ByteBuffer.allocate(B2);
      ByteBuffer b3 = ByteBuffer.allocate(B3);

      ByteBuffer[] buffers = {b1, b2, b3};

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

Из эта книга.

Ответ 4

Вы должны выяснить, какая часть программы занимает время.

В соответствии с ответом EJP вы должны использовать BufferedReader.

Если на самом деле строковая обработка занимает много времени, вам следует рассмотреть возможность использования потоков, один поток будет читать строки файлов и очередей. Другие потоки струнных процессоров будут деактивировать линии и обработать их. Вам нужно будет исследовать, сколько потоков использовать, количество потоков, которые вы должны использовать в приложении, должно быть связано с количеством ядер в процессоре, таким образом, будет использоваться полный процессор.

Ответ 5

Используйте BufferedReader для доступа к файлу высокой производительности. Но размер буфера по умолчанию 8192 байта часто слишком мал. Для огромных файлов вы можете увеличить размер буфера по порядку величин, чтобы повысить производительность чтения файлов. Например:

BufferedReader br = new BufferedReader("file.dat", 1000 * 8192);
while ((thisLine = br.readLine()) != null) {
    System.out.println(thisLine);
}  

Ответ 6

Если вы хотите прочитать все строки вместе, вы должны посмотреть на API файлов java 7. Его очень просто использовать.

Но лучше всего будет обрабатывать этот файл в пакете. У читателя, который читает фрагменты строк из файла и писателя, который выполняет необходимую обработку или сохраняет данные. Устранение будет гарантировать, что оно будет работать, даже если линии в будущем увеличатся до миллиарда. Также вы можете иметь пакет, который использует многопоточность, чтобы увеличить общую производительность партии. Я бы рекомендовал, чтобы вы просмотрели пакет spring.