Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Парсинг 2GB файла одновременно двумя потоками?


Автор: unkis 11.4.2007, 19:02
Ребята меня интересует следующее:

Есть файлы размером от 2GB и выше, задача читать этот файл по строчно и  выбирать из строки нужную информацию.

Возможно ли и имеет ли смысл парсить каждый файл несколькими потоками?
Насколько будет выигрыш в скорости, и будет ли он вообще?
И какие проблемы могут возникнуть в такм случаи?

Очень интересно ваше мнение по этому вопросу?

Очень важна скорость

Автор: Бонифаций 11.4.2007, 19:04
проще попробовать.

Автор: skyboy 11.4.2007, 19:07
Цитата(unkis @  11.4.2007,  18:02 Найти цитируемый пост)
Возможно ли и имеет ли смысл парсить каждый файл несколькими потоками?

смотря какой парсинг. если простой - скорее всего, "узким местом" окажется обращение к носителю. и тогда многопоточность ничего не даст. если же алгоритм процессороемкий, а режим DMA работает - вполне, как мне думается, может быть прибыль: один поток загружает информацию из файла в память, пока другой свою часть обрабатывает...
Можно сделать так: один поток занимается загрузкой данных, а другой - парсит и парсит загруженные данные... 

Автор: unkis 11.4.2007, 19:58
а что-нибудь типа начать читать с разных концов, 
к примеру один поток читает с начала, а другой с конца?

Автор: nornad 11.4.2007, 21:05
Вряд ли это ускорит. Простой пример: время на копирование двух больших файлов поочерёдно всегда не больше (обычно меньше почти раза в полтора) времени на копирование тех же файлов параллельно.

Автор: LSD 11.4.2007, 21:51
Лучше сделать так: один поток читает данные и преобразует их в строки, другой(ие) потоки парсят эти данные.

А вообще skyboy, правильно сказал, тут все зависит от того, что будет узким местом.

Автор: unkis 11.4.2007, 22:41
А как понять что тут будет узким местом, если файлы это лог-файлы, которые хранятся на жёстком диске, и я так понимаю что узким местом здесь будет именно жёсткий диск.



Автор: LSD 11.4.2007, 23:01
Во первых, в чем заключается парсинг? Насколько он ресурсоемок?
Во вторых, напиши тест и посмотри на загрузку процессора.

Автор: alexsolo 12.4.2007, 13:53
Цитата(unkis @ 11.4.2007,  19:02)
Есть файлы размером от 2GB и выше, задача читать этот файл по строчно и  выбирать из строки нужную информацию.

Если памяти больше 2 GB то можно папить весь файл в память целиком и парсить его хоть 10 потоками (кстати, JVM параллелит потоки на разные ядра на многоядерниках?) Если памяти меньше размера файла, то каждый поток мапит фрагмент за фрагментом файла максимально допустимой длины и обрабатывает его. 

Автор: Бонифаций 12.4.2007, 14:26
Если вы пап^H^H^Hмам^H^H^Hмапите  файл то физической памяти не расходуется. Только адресное пространство. по крайней мере в unix-ах/linux-ах


Автор: LSD 12.4.2007, 14:32
Цитата(alexsolo @  12.4.2007,  13:53 Найти цитируемый пост)
кстати, JVM параллелит потоки на разные ядра на многоядерниках?

По умолчанию JVM использует потоки ОС, так что это от ОС зависит.

Мапить файл в память можно, но проблема в том, что из байтов его еще нужно преобразовать в символы, а затем строки.

Автор: alexsolo 12.4.2007, 14:47
Цитата

Если вы мапите  файл то физической памяти не расходуется. Только адресное пространство. по крайней мере в unix-ах/linux-ах

Я только пока под Windows мапил - там с этим делом строго smile
Цитата

Мапить файл в память можно, но проблема в том, что из байтов его еще нужно преобразовать в символы, а затем строки.

Ну,  это, не сложно smile
В общем надо плясать от ТЗ - что за OS, сколько памяти, сколько ядер у CPU ну и тесты погонять - если чтение с диска даже просто с
BufferedInputStream сделать, то основное время обработки все равно в самом парсере будет  smile 






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)