![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Mikail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 24.12.2007 Репутация: нет Всего: нет |
Как правильно с помощью java искать в текстовом файле некое слово. Допустим, в текстовом файле 1000000 строк по 40-50 символов. Как оптимально быстро и грамотно найти слово в этом массиве при минимальном расходе оперативки?
|
|||
|
||||
| Aizek |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.11.2006 Репутация: нет Всего: нет |
Можно глупо читать строку и проверять наличие типа indexOf(). Если будет не отрицательное значение, слово найдено.
|
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Что значит "найти"? Вам необходимо установить сам факт наличия слова в тексте, отыскать позицию первого вхождения или вообще получить список позиций всех вхождений?
Для первого случая достаточно запуска утилиты grep на файле. Во втором и третьем придётся читать файл. Наименьший объём памяти при этом будет именно при построчном считывании. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
А если задача подразумевает неоднократный поиск по редко изменяемым данным, то лучше использовать индексирование. Например Apache Lucine будет весьма кстати.
|
|||
|
||||
| Mikail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 24.12.2007 Репутация: нет Всего: нет |
Спасибо всем за советы, но построчное считываение с проверкой index0f слишком медленное.
По условию задачи надо отыскать первое вхождение искомого в файле. Как это сделать максимально быстро? Готовая поисковая система - слишком тяжелое решение. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Если нужно с минимальными затратами к памяти, то можно искать хешем, даже без буфферизации побайтовым чтением (что будет медленно), смотрим тут. Если нужна именно скорость, то tubo-bm по моему самое скоростное.
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Совершенно неважно сколько будет сравнений в памяти, какой алгоритм оптимизации этих сравнений и тд. Важно только количество IO операций (каждая 5ms или около того). Соответственно, минимизировать это количество - первоочередная задача. Как вариант - RandomAccessFile. Читаешь скажем 100к-500к в байт массив, создаешь из него StringBuilder и пользуешь indexOf. Все должно летать и работать с маленькими объемами памяти если не забыть пересипользовать тот же самый массив и StringBuilder объект.
ну либо с помощью grep, как nornad выше сказал. Но я про nio почти ничего знаю. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
кстати, BufferedReader тоже может прочитать мегабайт за раз и образовать char[] array. Вот его в стринг билдер и суй.
ну и циклы, проверки и т.д. Это сообщение отредактировал(а) niasilil - 12.2.2008, 00:17 -------------------- SCJP 5.0, SCJD |
|||
|
||||
| Mikail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 24.12.2007 Репутация: нет Всего: нет |
Огромне всем спасибо!
|
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Не забудь ситуацию когда половина искомого слова приходится на первый прочитанный блок, а вторая часть на другой. То если ищешь "blahblah", а в первом блоке только "bla" а во втрором "hblah", то надо бы второй блок читать не с 100000 позиции, а только с (100000 - 8). Легко забыть и ошибка не сразу всплывет. -------------------- SCJP 5.0, SCJD |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |