Чтение и обработка большого текстового файла объемом 25 ГБ - PullRequest
10 голосов
/ 11 января 2012

Мне нужно прочитать большой текстовый файл, скажем, 25 ГБ, и мне нужно обработать этот файл в течение 15-20 минут. Этот файл будет иметь несколько разделов верхнего и нижнего колонтитула.

Я попытался CSplit разделить этот файл на основе заголовка, но требуется около 24-25 минут, чтобы разделить его на несколько файлов на основе заголовка, что совершенно неприемлемо.

Я пытался последовательно читать и писать, используя BufferReader и BufferWiter вместе с FileReader и FileWriter. Это займет более 27 минут. Опять же, это не приемлемо.

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

Как мне выполнить мое требование?

Возможный дубликат:

Чтение больших файлов на Java

Ответы [ 4 ]

8 голосов
/ 11 января 2012

Попробуйте использовать большой размер чтения буфера (например, 20 МБ вместо 2 МБ), чтобы быстрее обрабатывать ваши данные.Также не используйте BufferedReader из-за низкой скорости и преобразования символов.

Этот вопрос задавался ранее: Чтение больших файлов в Java

6 голосов
/ 11 января 2012

Вы должны убедиться, что IO достаточно быстр без вашей обработки, потому что я подозреваю, что обработка не IO замедляет вас.Вы должны иметь возможность получить 80 МБ / с с жесткого диска и до 400 МБ / с с SSD-накопителя.Это означает, что вы можете прочитать все за одну секунду.

Попробуйте выполнить следующее, что не является самым быстрым, но самым простым./ s у вас аппаратная проблема.

1 голос
/ 11 января 2012

Если платформа правильная, вы можете раскошелиться и вызвать комбинацию cat и sed.Если это не так, вы все равно можете выложить и использовать Perl через командную строку.Для случая, когда Java должна выполнять фактическую обработку, другие предоставили достаточные ответы.

Будьте настороже, однако, обстрелы не без проблем.Но perl или sed могут быть единственными широко доступными инструментами для сканирования и изменения 25 ГБ текста на вашем таймфрейме.

1 голос
/ 11 января 2012

Попробуйте использовать java.nio, чтобы лучше использовать функциональность операционных систем. Избегайте копирования данных (например, в строку), но попробуйте работать с смещениями . Я полагаю, что классы java.nio будут даже иметь методы для переноса данных из одного буфера в другой, вообще не перетаскивая данные в слой java (по крайней мере, в linux), но это по существу будет переводиться в вызовы операционной системы.

Для многих современных веб-серверов этот метод является ключом к производительности, с которой они могут обслуживать статические данные: по сути, они делегируют как можно больше операционной системе, чтобы избежать дублирования их в основной памяти.

Позвольте мне подчеркнуть это: простой поиск в байтовом буфере 25 ГБ намного быстрее, чем преобразование его в строки Java (что может потребовать кодирования / декодирования кодировки - и копирования). Все, что спасет вас от копирования и управления памятью, поможет.

...