Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильный способ искать слово в текстовом файле 
V
    Опции темы
Mikail
Дата 11.2.2008, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 24.12.2007

Репутация: нет
Всего: нет



Как правильно с помощью java искать в текстовом файле некое слово. Допустим, в текстовом файле 1000000 строк по 40-50 символов. Как оптимально быстро и грамотно найти слово в этом массиве при минимальном расходе оперативки?
PM MAIL   Вверх
Aizek
Дата 11.2.2008, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Можно глупо читать строку и проверять наличие типа indexOf(). Если будет не отрицательное значение, слово найдено.
PM MAIL   Вверх
nornad
Дата 11.2.2008, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Что значит "найти"? Вам необходимо установить сам факт наличия слова в тексте, отыскать позицию первого вхождения или вообще получить список позиций всех вхождений?
Для первого случая достаточно запуска утилиты grep на файле. Во втором и третьем придётся читать файл. Наименьший объём памяти при этом будет именно при построчном считывании.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
powerOn
Дата 11.2.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



А если задача подразумевает неоднократный поиск по редко изменяемым данным, то лучше использовать индексирование. Например Apache Lucine будет весьма кстати. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Mikail
Дата 11.2.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 24.12.2007

Репутация: нет
Всего: нет



Спасибо всем за советы, но построчное считываение с проверкой index0f слишком медленное.
По условию задачи надо отыскать первое вхождение искомого в файле. Как это сделать максимально быстро?
Готовая поисковая система - слишком тяжелое решение.
PM MAIL   Вверх
Sardar
Дата 11.2.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Если нужно с минимальными затратами к памяти, то можно искать хешем, даже без буфферизации побайтовым чтением (что будет медленно), смотрим тут. Если нужна именно скорость, то tubo-bm по моему самое скоростное.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
niasilil
Дата 11.2.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Совершенно неважно сколько будет сравнений в памяти, какой алгоритм оптимизации этих сравнений и тд. Важно только количество IO операций (каждая 5ms или около того). Соответственно, минимизировать это количество - первоочередная задача. Как вариант - RandomAccessFile. Читаешь скажем 100к-500к в байт массив, создаешь из него StringBuilder и пользуешь indexOf. Все должно летать и работать с маленькими объемами памяти если не забыть пересипользовать тот же самый массив и StringBuilder объект.

ну либо с помощью grep, как nornad выше сказал. Но я про nio почти ничего знаю.


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
niasilil
Дата 12.2.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



кстати, BufferedReader тоже может прочитать мегабайт за раз и образовать char[] array. Вот его в стринг билдер и суй. 
Код

        final int SIZE = 100000;
        FileReader fr = new FileReader("test.txt");
        BufferedReader br = new BufferedReader(fr, SIZE);

        char[] b = new char [SIZE];
        br.read(b, 0, b.length);

        StringBuilder sb = new StringBuilder();
        sb.setLength(0);
        sb.append(b);

        System.out.println(sb.indexOf("blah"));


ну и циклы, проверки и т.д. 

Это сообщение отредактировал(а) niasilil - 12.2.2008, 00:17


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
Mikail
Дата 12.2.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 24.12.2007

Репутация: нет
Всего: нет



Огромне всем спасибо!
PM MAIL   Вверх
niasilil
Дата 13.2.2008, 01:38 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Цитата(Mikail @ 12.2.2008,  23:16)
Огромне всем спасибо!

Не забудь ситуацию когда половина искомого слова приходится на первый прочитанный блок, а вторая часть на другой. То если ищешь "blahblah", а в первом блоке только "bla" а во втрором "hblah", то надо бы второй блок читать не с 100000 позиции, а только с (100000 - 8). Легко забыть и ошибка не сразу всплывет. 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1130 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.