|
|
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Привет, All! Подскажите, плз, ламеру в джаве - как сделать быстрй поиск текста в файле? файл 100М, пробовал что-то типа: FileReader fr = new FileReader (fpath); BufferedReader br = new BufferedReader(file_name); String s; while ((s = br.readLine()) != null) { boolean fl_a = false; if (s.length() != 0) { String sa = s.substring(0,9).trim(); if (sa.equals(search_string)) fl_a = true; ... сек 20 лопатит...-( заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 16:41:40 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
RandomAccessFile, метод read ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 17:02:04 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Доступно и понятно ;) тнкс а лот...примерчика какого не будет? чем, вернее насколько данный метод быстрее будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 17:18:50 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Гость1111Доступно и понятно ;) тнкс а лот...примерчика какого не будет? чем, вернее насколько данный метод быстрее будет? Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу. Не вижу причин, чтобы вы делали по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 17:30:17 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Более того - я успел протестировать скорость работы - она довольно высока (не более 1.5 секунд на чтение 120-ти мегабайтного файла) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 17:31:28 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Спасибо еще раз. теперь есть критерий ориентировочный - открою доку -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 17:37:52 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он же Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу. Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ? Если Вы заранее знаете место расположение текста в файле, тогда понятно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 18:22:42 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ? Если Вы заранее знаете место расположение текста в файле, тогда понятно :) Ну что вы в самом деле. Не писали в детстве свой regexp на паскале? Там не было ничего кроме возможности максимально быстро получить набор байтиков из файла. Я смотрю, в Java ситуация ровно такая же. Хочешь чтобы всё максимально быстро и эффективно работало - пиши своё. И это хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 18:31:56 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov он же Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу. Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ? Если Вы заранее знаете место расположение текста в файле, тогда понятно :) И что Вы можете порекомендовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 18:32:32 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Причем непонятно - у автора файл типизированный или нет? Это просто текст в разнобой? Нужно искать просто какую-то уникальную строку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 18:33:55 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
файл типизированный 46 байт в строке, затем CR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 18:50:29 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Гость1111файл типизированный 46 байт в строке, затем CR - это очень хорошо! это дает возможность легко разбить файл на блоки (кратные 47), которые будут анализироваться отдельно (параллельно). Когда то мне поставили задачу парсить гигабайтных размеров текстовый файл со статистикой. Для анализа больших файлов можно разбивать их на куски (тут действительно поможет RandomAccessFile), а каждый кусок анализировать в отдельном потоке, т. е. создать многопоточное приложение. Правда здесь возникают другие проблемы, лимитом скорости обработки становится не жесткий диск, а недостаток мощности процессора, т. е. достигается почти 100% загрузка процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 20:04:33 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
А если не хочется заморачиваться с потоками - можно просто читать Nx(46+1) и сравнивать без проблем :) Будет очень быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 20:17:38 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он жеБудет очень быстро. - быстрее чем BufferedReader не будет. Проверено. При линейном чтении файла использование этого потока дает максимально возможный эффект (размер буфера по умолчанию 256, что не хуже чем 47). - еще один путь повышения эффективности - аккуратные действия со строками. Substring, trim, не дай Бог match, при многократном вызове заметно замедляют программу, попробуйте indexOf - он работает быстрее! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 20:32:05 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
читать не линейно, а блоками :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 21:20:15 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov он жеБудет очень быстро. - быстрее чем BufferedReader не будет. Проверено. При линейном чтении файла использование этого потока дает максимально возможный эффект (размер буфера по умолчанию 256, что не хуже чем 47). - еще один путь повышения эффективности - аккуратные действия со строками. Substring, trim, не дай Бог match, при многократном вызове заметно замедляют программу, попробуйте indexOf - он работает быстрее! Да, но я вроде как BufferedReader с его readline и использовал... indexOf конечно попробую, но думается заметно быстрее не будет... А что посоветутете если загонять данные в байтмассив по 1М и далее читать его в цикле? Понимаю, что вопросы ламерские...-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 21:22:25 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Гость1111Да, но я вроде как BufferedReader с его readline и использовал... indexOf конечно попробую, но думается заметно быстрее не будет... - будет, будет. 100Mb/47byte=2.2 млн. строк. Если 2 миллиона раз выполнять не оптимизированые действия можно много потерять в производительности. Гость1111 А что посоветутете если загонять данные в байтмассив по 1М и далее читать его в цикле? Понимаю, что вопросы ламерские...-) - вопрос не ламерский :) Не попробовав не ответишь. Я уже попробовал :( Это почти ничем не отличается по быстродействию от BufferedReader, хотя возможны варианты в зависимости от того какие жесткие диски Вы используете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 21:51:28 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он жечитать не линейно, а блоками :) - а блоками читать как? по очереди? т. е. линейно как при наличии буфера, только буфер будет не 256 байт как по умолчанию в буферизованых потоках, а 47, кстати размер буфера в буферизованых потоках можно менять, задайте его в 47 байт и Вы увидите, что ничего не изменилось. - а если блоки читать паралельно, по моему, никак без многопоточности не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 21:56:17 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
А я так хорошо пил пиво... См. аттач. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 22:28:45 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Доводку напильником оставляю на совести того, кому этот пример пригодится :) А доводка нужна. Начиная с обработки EOFException и заканчивая оптимальным выбором MULT. Я ответил на вопрос Kachalov он жечитать не линейно, а блоками :) - а блоками читать как? по очереди? ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2006, 22:32:45 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он жеЯ ответил на вопрос Kachalov он жечитать не линейно, а блоками :) - а блоками читать как? по очереди? ? :) - выходит читаете по очереди блоками, т. е. линейное чтение, если то же самое сделате с буферизованым потоком, результаты по быстродействию будут те же самые, а код получится проще. Представленное решение иллюстрирует как можно с помощью класса RandomAccessFile создать аналог буферизованого чтения :( P. S. не обязательно было писать этот код, основы программирования на Java многим знакомы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 00:14:20 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Согласен что RandomAccessFile врятли поможет Есть мудрые алгоритмы типа КМП(Кнута — Морриса — Пратта) Врятли захочется с ними возиться, но если выигрыш в скорости действительно нужен .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 03:37:27 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov - выходит читаете по очереди блоками, т. е. линейное чтение, если то же самое сделате с буферизованым потоком, результаты по быстродействию будут те же самые, а код получится проще. Представленное решение иллюстрирует как можно с помощью класса RandomAccessFile создать аналог буферизованого чтения :( P. S. не обязательно было писать этот код, основы программирования на Java многим знакомы :) Боюсь, основы плохо знакомы. Иначе вы не говорили бы, что 3.5 сек (моё решение) и 5.8 сек (BufferedReader) - это одинаковая скорость. И это в случае уже закэшированного виндой файлика. Если обрабатываем с чтением, то цифры: Proceed 290374304 bytes records in 11031 msec with 6178176 failures Proceed 287888895 buffered bytes in 26422 msec with 2537871 failures Только тут не совсем честно, т.к. файлы совершенно произвольные. А может вы хотите чтобы всё парсилось еще в 5 раз быстрее? Тогда с Java нужно уходить с сторону плюсов. Код, как я понял, приводить не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 09:37:32 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
2 Гость111, он же Я - бы предложил упростить постановку. 1) Давайте считать, что мы ищем в структурированом бинарном файле (размер структуры = 47 байт) подстроку байтов в поле типа byte[9] по смещению 0 от начала структуры. В этом случае, можно "забить" на строковые операции и делать поиски прямо по буферу чтения. Искомую строку можно заранее сконвертировать в байтовый массив. Условно считаем, что байт = символ в коде ASCII. 2) Подозреваю, что следующие операции в теле цикла Код: plaintext 1. 2. 3. 3) Меня удивляет что CurrentTimeMillis() выдает (в Windows) сильно "загрублённое" время. И время работы процеса (разность между снапшотами) я вижу - как константу. Это настораживает. Поэтому в качестве функции снапшота времени предлагаю использовать не CurrentTimeMillis(), а nanoTime()/1000000. Она более точна ИМХО. С уваженим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:31:15 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=645&tid=2145998]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
41ms |
get topic data: |
19ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
3ms |
| others: | 273ms |
| total: | 462ms |

| 0 / 0 |
