| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Парсинг 2GB файла одновременно двумя потоками? |
| Автор: unkis 11.4.2007, 19:02 |
| Ребята меня интересует следующее: Есть файлы размером от 2GB и выше, задача читать этот файл по строчно и выбирать из строки нужную информацию. Возможно ли и имеет ли смысл парсить каждый файл несколькими потоками? Насколько будет выигрыш в скорости, и будет ли он вообще? И какие проблемы могут возникнуть в такм случаи? Очень интересно ваше мнение по этому вопросу? Очень важна скорость |
| Автор: Бонифаций 11.4.2007, 19:04 |
| проще попробовать. |
| Автор: 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 | ||
Если памяти больше 2 GB то можно папить весь файл в память целиком и парсить его хоть 10 потоками (кстати, JVM параллелит потоки на разные ядра на многоядерниках?) Если памяти меньше размера файла, то каждый поток мапит фрагмент за фрагментом файла максимально допустимой длины и обрабатывает его. |
| Автор: Бонифаций 12.4.2007, 14:26 |
| Если вы пап^H^H^Hмам^H^H^Hмапите файл то физической памяти не расходуется. Только адресное пространство. по крайней мере в unix-ах/linux-ах |
| Автор: LSD 12.4.2007, 14:32 |
По умолчанию JVM использует потоки ОС, так что это от ОС зависит. Мапить файл в память можно, но проблема в том, что из байтов его еще нужно преобразовать в символы, а затем строки. |
| Автор: alexsolo 12.4.2007, 14:47 | ||||
Я только пока под Windows мапил - там с этим делом строго
Ну, это, не сложно В общем надо плясать от ТЗ - что за OS, сколько памяти, сколько ядер у CPU ну и тесты погонять - если чтение с диска даже просто с BufferedInputStream сделать, то основное время обработки все равно в самом парсере будет |