Разбор огромного простого текстового файла - PullRequest
1 голос
/ 31 января 2012

У меня огромный текстовый файл (207 МБ, 4 миллиона строк), и мне нужно читать его последовательно построчно.Каждая строка имеет этот формат: 20227993821NAME AND SURNAME NINIC NN08 Я использовал (для обычных файлов) библиотеки Java FileReader и BufferedReader следующим образом:

FileReader dataFile = new FileReader(directory);
data = new BufferedReader(dataFile);
String s;
while((s = data.readLine()) != null){
    //do stuff
}

без проблем, но для больших файлов обработка занимает слишком много времени.Интересно, что было бы наилучшей практикой в ​​таких случаях (другая библиотека, другие методы и т. Д.), Все было бы полезно.Файл периодически выдается государственным органом, и он должен быть загружен в мое программное обеспечение для сравнения данных.

Редактировать:

Этот код:

BufferedReader data = new BufferedReader(new FileReader(file));
String s;
int count = 0;
while ((s = data.readLine()) != null) {
   System.out.println (count + " - " + s);
   count++;
}
data.close();

выполняется за 19 минут 30 секунд.Я не знаю, почему это заняло так много времени.У меня 64-разрядная операционная система и процессор i5.

1 Ответ

7 голосов
/ 31 января 2012

Если я запускаю

File file = new File("/tmp/deleteme.txt");
file.deleteOnExit();

long start = System.nanoTime();
PrintWriter pw = new PrintWriter(file);
for (int i = 0; i < 4 * 1000 * 1000; i++)
    pw.println("01234567890123456789012345678901234567890123456789");
pw.close();

long mid = System.nanoTime();
BufferedReader data = new BufferedReader(new FileReader(file));
String s;
while ((s = data.readLine()) != null) {
    //do stuff
}
data.close();
long end = System.nanoTime();

System.out.printf("Took %.3f seconds to write and %.3f seconds to read a %.2f MB file.%n",
        (mid - start) / 1e9, (end - mid) / 1e9, file.length() / 1e6);

, он печатает

Took 0.465 seconds to write and 0.522 seconds to read a 204.00 MB file.

РЕДАКТИРОВАТЬ: если я распечатываю каждую строку, он значительно замедляется, потому что запись на экран занимает много времени.Я обнаружил, что окно MS-DOS особенно медленное.

Took 0.467 seconds to write and 10.254 second to read a 204.00 MB file.

Я не верю, что чтение файла занимает слишком много времени, это то, что вы делаете с ним, что занимаетдолгое время.

...