![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
unkis |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 802 Регистрация: 8.9.2004 Репутация: нет Всего: 1 |
Ребята меня интересует следующее:
Есть файлы размером от 2GB и выше, задача читать этот файл по строчно и выбирать из строки нужную информацию. Возможно ли и имеет ли смысл парсить каждый файл несколькими потоками? Насколько будет выигрыш в скорости, и будет ли он вообще? И какие проблемы могут возникнуть в такм случаи? Очень интересно ваше мнение по этому вопросу? Очень важна скорость -------------------- www.unkis.com |
|||
|
||||
Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 1 Всего: 40 |
проще попробовать.
-------------------- Бонифаций. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
смотря какой парсинг. если простой - скорее всего, "узким местом" окажется обращение к носителю. и тогда многопоточность ничего не даст. если же алгоритм процессороемкий, а режим DMA работает - вполне, как мне думается, может быть прибыль: один поток загружает информацию из файла в память, пока другой свою часть обрабатывает... Можно сделать так: один поток занимается загрузкой данных, а другой - парсит и парсит загруженные данные... |
|||
|
||||
unkis |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 802 Регистрация: 8.9.2004 Репутация: нет Всего: 1 |
а что-нибудь типа начать читать с разных концов,
к примеру один поток читает с начала, а другой с конца? -------------------- www.unkis.com |
|||
|
||||
nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Вряд ли это ускорит. Простой пример: время на копирование двух больших файлов поочерёдно всегда не больше (обычно меньше почти раза в полтора) времени на копирование тех же файлов параллельно.
-------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Лучше сделать так: один поток читает данные и преобразует их в строки, другой(ие) потоки парсят эти данные.
А вообще skyboy, правильно сказал, тут все зависит от того, что будет узким местом. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
unkis |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 802 Регистрация: 8.9.2004 Репутация: нет Всего: 1 |
А как понять что тут будет узким местом, если файлы это лог-файлы, которые хранятся на жёстком диске, и я так понимаю что узким местом здесь будет именно жёсткий диск.
-------------------- www.unkis.com |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Во первых, в чем заключается парсинг? Насколько он ресурсоемок?
Во вторых, напиши тест и посмотри на загрузку процессора. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
alexsolo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.4.2007 Репутация: нет Всего: нет |
Если памяти больше 2 GB то можно папить весь файл в память целиком и парсить его хоть 10 потоками (кстати, JVM параллелит потоки на разные ядра на многоядерниках?) Если памяти меньше размера файла, то каждый поток мапит фрагмент за фрагментом файла максимально допустимой длины и обрабатывает его. |
|||
|
||||
Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 1 Всего: 40 |
Если вы пап^H^H^Hмам^H^H^Hмапите файл то физической памяти не расходуется. Только адресное пространство. по крайней мере в unix-ах/linux-ах
-------------------- Бонифаций. |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
По умолчанию JVM использует потоки ОС, так что это от ОС зависит. Мапить файл в память можно, но проблема в том, что из байтов его еще нужно преобразовать в символы, а затем строки. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
alexsolo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.4.2007 Репутация: нет Всего: нет |
Я только пока под Windows мапил - там с этим делом строго ![]()
Ну, это, не сложно ![]() В общем надо плясать от ТЗ - что за OS, сколько памяти, сколько ядер у CPU ну и тесты погонять - если чтение с диска даже просто с BufferedInputStream сделать, то основное время обработки все равно в самом парсере будет ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |