|
|
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#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 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он же Боюсь, основы плохо знакомы. Иначе вы не говорили бы, что 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 Только тут не совсем честно, т.к. файлы совершенно произвольные. - на одном и том же файле с данными размером 500Мб (искомые данные в последней строке), Ваш вариант поиска дал 18266 мс, а заметно более простой код с использованием BufferedReader и метода startsWith для поиска вхождения в строку, дал 25610 мс. Разница в быстродействии около 30% (хотя сознаюсь, я и такой не ожидал), а в сложности кода 3-х кратная. На всякий случай приведу пример кода (хотя он совершенно тривиальный), чтобы не было разночтений: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:53:55 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
(' 1234567 ').startsWith != (' 1234567 8899').substring(0,9).trim() Хотя может автору это и не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 14:59:03 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
!= - это конечно означает "не равны" (не равны методом equals) :) чтобы не было разночтений :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 15:00:14 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он же!= - это конечно означает "не равны" (не равны методом equals) :) чтобы не было разночтений :) - это был один из тезисов: "оптимизировать работу с текстом" :) - изначально сравнение производил на Windows 2000 диск SATA: Код: plaintext 1. 2. - решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 15:16:55 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov Код: plaintext 1. 2. Усредненное из 3-5 попыток? Или после перезагрузки и принудительной очистки файла подкачки? Если сразу же друг за другом - эксперимент не выдерживает никакой критики :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 16:34:58 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
он же Если сразу же друг за другом - эксперимент не выдерживает никакой критики :) - 3 попытки по очереди для каждого примера, т. е. пример1-пример2-пример1-пример2 и т. д. - усреднять не стал, взял не крайние значения - Linux сервер рабочий, средне нагруженый, паралелльно с тестами работал web-сервер и БД что, я думаю, хорошо отражает реальные условия работы. - если не лень погоняйте примеры сами на разных машинах, а то как цифры не нравятся, так "эксперимент не выдерживает никакой критики", а как получается удобный результат, так никаких вопросов о качестве тестов не возникает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 16:59:37 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov - если не лень погоняйте примеры сами на разных машинах, а то как цифры не нравятся, так "эксперимент не выдерживает никакой критики", а как получается удобный результат, так никаких вопросов о качестве тестов не возникает :) Я не сомневаюсь в своих тестах, т.к. сам их проводил :) А про вас мне ничего не известно. Может вы злой и хитрый Ладно, что-то отклонились от темы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 17:21:39 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
http://forum.java.sun.com/thread.jspa?threadID=476507&tstart=60 искать в тексте слова: public class searcher ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 17:48:14 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
сборник реализаций поиска: http://www.ccs.neu.edu/home/gassko/Courses/CSG113/PROJECTS/Searching/IndexSearch.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 17:52:24 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Kachalov он же!= - это конечно означает "не равны" (не равны методом equals) :) чтобы не было разночтений :) - это был один из тезисов: "оптимизировать работу с текстом" :) - изначально сравнение производил на Windows 2000 диск SATA: Код: plaintext 1. 2. - решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2006, 22:15:20 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
SolaroidГде взять стомегабайтный файл? И что вы в нем ищете? - думаю это вопрос не ко мне :) посмотрите на первое сообщение в теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 00:08:00 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Solaroid Kachalov он же!= - это конечно означает "не равны" (не равны методом equals) :) чтобы не было разночтений :) - это был один из тезисов: "оптимизировать работу с текстом" :) - изначально сравнение производил на Windows 2000 диск SATA: Код: plaintext 1. 2. - решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат: Код: plaintext 1. 2. 100М это средний файлик, есть еще и 150-200М, записи в них не большие, но их много (150М окло 3,5 млн.записей) и это объем данных за один день, а искть нужно в данных за месяц... Дело в том, что хранить данные записи файлов (это телефония) в данный момент в БД возможности нет, поэтому реализован поиск в файлах (которые с сетевого ресурса замапены на никс). На данный момент самое быстрое найденное решение (для моего случая работы с БД Оракле) - это использование sqlloadera и с установкой фильтра в ctl-файле (да простят меня те, кто не работает с Оралке) Тема разумеется еще не закрыта - буду копать дальше в сторону Java, но уж больно Оракле заточил хорошо свой SQLLOADER, боюсь в данном случае это будет самым оптимальным решением. Большое спасибо ВСЕМ, кто принял и примет участие! ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 07:43:33 |
|
||
|
быстрый поиск в файле
|
|||
|---|---|---|---|
|
#18+
Гость1111 100М это средний файлик, есть еще и 150-200М, записи в них не большие, но их много (150М окло 3,5 млн.записей) и это объем данных за один день, а искть нужно в данных за месяц... Дело в том, что хранить данные записи файлов (это телефония) в данный момент в БД возможности нет, поэтому реализован поиск в файлах (которые с сетевого ресурса замапены на никс). Индексы стоить для файлов и класть рядом не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2007, 19:18:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2145998]: |
0ms |
get settings: |
13ms |
get forum list: |
21ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
46ms |
get topic data: |
18ms |
get forum data: |
5ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 329ms |
| total: | 528ms |

| 0 / 0 |
