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();
}
}
Ответы
Ответ 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.