2015-06-01 2 views
2

Для проекта, над которым я работаю, я стараюсь как можно быстрее подсчитать гласные в текстовом файле. Для этого я пытаюсь использовать параллельный подход. Мне было интересно, можно ли одновременно читать текстовый файл, чтобы ускорить подсчет? Я считаю, что узким местом является ввод-вывод, и поскольку сейчас я читаю файл через буферизованный читатель и обрабатываю строку за строкой, мне было интересно, можно ли сразу прочитать несколько разделов файла.Разбиение файла в Java на многопоточность

Моя первоначальная мысль была использовать Split File - Java/Linux

но видимо MappedByteBuffers не большой производительности мудрый, и я по-прежнему нужно читать построчно из каждого MappedByteBuffer раз я разделил.

Другим вариантом является разделение после прочтения определенного количества строк, но это побеждает цель.

Поблагодарили бы за любую помощь.

+0

Эта часть наиболее трудоемкая часть вашей программы? Возможно, вы можете просто кэшировать его. –

+3

Если у вас нет очень большого массива RAID 0 или одного или нескольких накопителей SSD, чтение файла одновременно приведет к разрыву диска и _slow down_ вашего приложения. Учитывая задание обработки, которое у вас есть, очень просто (быстро читайте), вы вряд ли сможете получить от потоковой передачи, поскольку вы ограничены IO, а не ограничены ЦП. –

+0

'как можно быстрее' Вы можете объяснить, почему? В чем проблема с простое чтение файла? – copeg

ответ

0

Следующий раздел НЕ будет разбит файл - но может помочь при его одновременной обработке!

Использование потоков в Java 8 вы можете сделать что-то вроде:

Stream<String> lines = Files.lines(Paths.get(filename)); 
lines.filter(StringUtils::isNotEmpty) // ignore empty lines 

, и если вы хотите работать параллельно вы можете сделать:

lines.parallel().filter(StringUtils::isNotEmpty) 

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

+2

Это будет «буферизовать» несколько строк из файла и передать каждый фрагмент остальной части конвейера, параллелизируя обработку - пример шаблона производителя/потребителя (ish). У Марко Топольника есть [очень хорошая статья] (https://www.airpair.com/java/posts/parallel-processing-of-io-based-data-with-java-streams) о том, как все это работает. Короткий рассказ заключается в том, что, если обработка довольно медленная, поведение по умолчанию не будет идеальным. –

+0

@BoristheSpider спасибо за ссылку - я проверю это сегодня вечером! – alfasin

+0

@BoristheSpider отличная статья ... – jstnchng

Смежные вопросы