Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск строк в файле большого размера 
:(
    Опции темы
Олег13
Дата 5.7.2011, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток!
Посоветуйте как быть с поиском и выборкой строк и текстового файла большого размера. В общем у меня задача такая: у меня есть файл TXT (это англо-русский словарь), объем 7 Мб (120000 строк). Мне необходимо в нем производить поиск слов. Например вводишь слово "Dog", результатом поиска должны быть все строки в файле, которые сдержат слово "DOG". Я делаю так:
Код


#!/perl/bin/perl -w
open FF, "dictionary.txt";
@n=<FF>;
for ($i=0;$i<=$#n;$i++) {
if ($n[$i]=~m/dog/ig){
$res[$i]=$n[$i];
}
}
print "@res\n";


.........данный скрипт работает, но очень медленно (секунд 40-50 жду). Можно ли как-то ускорить поиск? Возможно надо производить поиск по другому принципу или улучшить рег. выражение? Подскажите, что можно сделать. Заранее спасибо.
PM MAIL   Вверх
SkoobyDoo
Дата 5.7.2011, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вроде 100500 тем таких было здесь!
Код

#!/usr/bin/env perl
use strict;
use warnings;

my ($file, $word) = @ARGV;
my @strings;

open my $IN, "< $file" or die "$!\n";
my @data = <$IN>;
close $IN;

for (@data) {
  push @strings, $_ if $_ =~ m/$word/i;
}

print "Word '$word' found in lines ", @strings;

запускаем 
Код

perl script.pl dictionary.txt apple


проверил на файле с 710000 строк, заняло 8 секунд

Это сообщение отредактировал(а) SkoobyDoo - 5.7.2011, 10:44
PM MAIL   Вверх
afiskon
Дата 5.7.2011, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Загрузите ваш словарь в память (120 000 строк - не так уж много) и производите поиск с помощью хэшей (%hash).
PM MAIL WWW   Вверх
Pfailed
Дата 5.7.2011, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как хеш поможет найти часть слова?
Лучше так попробуйте
Код

# считать весь файл в переменную
open FH, 'dict.txt';
$/ = undef;
$data = <FH>;
close FH;
# найти все слова
@found = $data =~ /(.*dog.*)/ig;




--------------------
PM MAIL   Вверх
afiskon
Дата 5.7.2011, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Цитата(Pfailed @ 5.7.2011,  07:01)
Как хеш поможет найти часть слова?

Вы пытаетесь решить задачу, как вы ее поняли, а не как она ставилась. Читаем:

Цитата

Например вводишь слово "Dog", результатом поиска должны быть все строки в файле, которые сдержат слово "DOG".


Где сказано про часть слова? Разбиваем строку на слова и создаем хэш слово -> указатель на строку. Вот и все решение.
PM MAIL WWW   Вверх
Pfailed
Дата 5.7.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если даже так, то ваше решение регистрозависимо.
Если посмотрите на решение автора, то поймете, что имелось ввиду.



--------------------
PM MAIL   Вверх
Олег13
Дата 5.7.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо всем за помощь. Все получилось, теперь поиск не занимает и 5 сек. Оказалось, что данную задачу можно решить без использования циклов. Воспользовался решением Pfailed
   А то я уже собирался разбить данный файл на мелкие файлы (чтобы в каждой части содержались слова на одну конкретную букву) и потом при старте скрипта, определять первую букву введенного искомого слова и таким образом переходить для поиска к файлу содержащему слова на данную букву. Заморочисто бы получилось.  В общем еще раз всех благодарю за помощь.  
PM MAIL   Вверх
afiskon
Дата 5.7.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Цитата

Если даже так, то ваше решение регистрозависимо.

Что мешает приводить ключи к нижнему регистру?

Цитата

теперь поиск не занимает и 5 сек

На хэшах он не будет занимать и 0.1 сек.
PM MAIL WWW   Вверх
Олег13
Дата 6.7.2011, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



afiskon, а ты бы не мог примерчик привести как организовать поиск через Хеши? Я бы хотел рассмотреть этот вариант, разобраться что и как работает. Ты писал выше, что надо строку на слова разбить, а потом создать указатель на нее. Как это сделать? Если не трудно, можно небольшой рабочий примерчик выложить? Я с хешами и указателями еще не сталкивался в своей недолгой практике программирования на PERL, так что я в этой области профан. Спасибо заранее.
PM MAIL   Вверх
afiskon
Дата 6.7.2011, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Как-то так:

Код

#!/usr/bin/env perl
use strict;

my %dict;

while(my $line = <>) {
  chomp($line);
  my @words = $line =~ /([^\s]+)/g;
  $dict{"\L$_"} = \$line for(@words);
}
print ${$dict{dog}}."\n";

использование:
Цитата

$ perl t.pl
cat кошка
bear медведь
dog песенг
lama лама
^D
dog песенг

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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