URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10141
[ Назад ]

Исходное сообщение
"помогите с простенькой задачкой"

Отправлено visitor , 14-Янв-17 19:24 
всем привет,

есть 2 файла:
1. список мыл
gagag@domain1.com
jdjdjd@domain2.com
...
kdkdk@domainX.com

2. список доменов:
domain1.com
domain2.com
...
domainX.com

задача сосотоит в том чтобы выкинуть все мыла из листа 1 домены которых совпали с доменами из листа 2

grep -v работает ужасно долго при больших листах - уверен перл справиться намного быстрее.

Спасибо!


Содержание

Сообщения в этом обсуждении
"помогите с простенькой задачкой"
Отправлено Led , 14-Янв-17 21:27 
Это в каком классе сейчас такие примитивные задачки сейчас задают?

"помогите с простенькой задачкой"
Отправлено Square1 , 14-Янв-17 22:35 
>[оверквотинг удален]
> 2. список доменов:
> domain1.com
> domain2.com
> ...
> domainX.com
> задача сосотоит в том чтобы выкинуть все мыла из листа 1 домены
> которых совпали с доменами из листа 2
> grep -v работает ужасно долго при больших листах - уверен перл справиться
> намного быстрее.
> Спасибо!

Иногда скорость не имеет решающего значения. Есть задачи, решение которых важно в принципиальном плане а не в частной реализации.

Что же до скорости....
Самое быстрое решение (если объем файлов действительно велик) - будет загнать оба списка в базу данных а потом сконструировать примитивный select ... like in (select ...)

Если объем файлов слишком велик для этого метода- то использовать шардинг.

Если объем файлов реально велик - то вероятно надо использовать MapReduce.

Что же до перла - то загрузка в перл больших объемов данных приводит к существенному потреблению памяти. Это надо помнить.


"помогите с простенькой задачкой"
Отправлено михалыч , 15-Янв-17 08:45 
Ну что же, сам напросился - получай ))

#!/usr/bin/perl

open (DOMAIN, /path/to/file/domain);
@domain{<DOMAIN>}=();

open (MAIL, /path/to/file/mail);
while (<MAIL>) {
    /^.*\@(.*)/;
    print unless exists $domain{"$1\n"};
}


насчет жручести памяти в перле будем считать тебя предупредили выше

"помогите с простенькой задачкой"
Отправлено Andrey Mitrofanov , 15-Янв-17 11:22 
> Ну что же, сам напросился - получай ))
> #!/usr/bin/perl
>     /^.*\@(.*)/;
> насчет жручести памяти в перле будем считать тебя предупредили выше

А тебя ещё чуть выше предупредили про "медленный" греп... В перле нет чего побыстрее для отрезания "всего до вон того символа"? Ну, вложенные циклы (найти вложенный - упражнение для читателей младше 2го курса #форумная-ЦС) оставим, как "подарок" начинающему падавану.

Вот я помню, реализацию типа-грепа на авке оптимизировал по скорости... Да, именно, почти, мап-ридьюс получился. Но там была возможность на исходную задачу навесить ограничения и срезать -- после какого-то порога не проверять остальные регекспы дальше.

--Гордый автор доморощенного неопубликованного спам-фильтра здесь, да, было по молодости.


"помогите с простенькой задачкой"
Отправлено universite , 15-Янв-17 19:03 
>> Ну что же, сам напросился - получай ))
>> #!/usr/bin/perl
>>     /^.*\@(.*)/;
>> насчет жручести памяти в перле будем считать тебя предупредили выше
> А тебя ещё чуть выше предупредили про "медленный" греп... В перле нет
> чего побыстрее для отрезания "всего до вон того символа"? Ну, вложенные
> циклы (найти вложенный - упражнение для читателей младше 2го курса #форумная-ЦС)
> оставим, как "подарок" начинающему падавану.

Правильно! Решение на awk не будем показывать!


"помогите с простенькой задачкой"
Отправлено Andrey Mitrofanov , 16-Янв-17 09:31 
>>> Ну что же, сам напросился - получай ))
>>> #!/usr/bin/perl
>>>     /^.*\@(.*)/;
>>> насчет жручести памяти в перле будем считать тебя предупредили выше
>> А тебя ещё чуть выше предупредили про "медленный" греп... В перле нет
>> чего побыстрее для отрезания "всего до вон того символа"? Ну, вложенные

user:~$ awk 'BEGIN{mail="som@example.com";dom=substr(mail,index(mail,"@")+1);print dom}'
example.com
user:~$ _

>> циклы (найти вложенный - упражнение для читателей младше 2го курса #форумная-ЦС)
>> оставим, как "подарок" начинающему падавану.
> Правильно! Решение на awk не будем показывать!

Конечно. Лениво же.


"помогите с простенькой задачкой"
Отправлено михалыч , 15-Янв-17 20:56 
> А тебя ещё чуть выше предупредили про "медленный" греп

да что за предъявы?
сижу никого не трогаю, починяю примус

на перле заказывали? получите, распишитесь ))

ну можно ещё так отрезать "всё до вон того символа"

#!/usr/bin/perl

open (DOMAIN, domain);
@domain{<DOMAIN>}=();

open (MAIL, mail);
while (<MAIL>) {
    $m=$_;
    $m=~s/^.*\@//;
    print unless exists $domain{$m};
}

но сути использования ключей хеша это не изменит

а ТС, если захочет, замерит, что там будет быстрее, чем

grep -vFf domain mail
и насколько быстрее,

а если памяти мало - так это не ко мне, это в магазин за углом ))


"помогите с простенькой задачкой"
Отправлено Andrey Mitrofanov , 16-Янв-17 09:40 
>> А тебя ещё чуть выше предупредили про "медленный" греп
> да что за предъявы?
> сижу никого не трогаю, починяю примус
> на перле заказывали? получите, распишитесь ))

Да, я так, погулять вышел. Греп тормоз, да. Я пробовал "поанализировать" в сторону, что в перле же тоже регекспы и поэтому-то... Доказательство по аналогии "считаю безобразной ошибкой"

--[Расскаиваюсь. Прошу дать возможность загладить, искупить.]Ц

> ну можно ещё так отрезать "всё до вон того символа"

#!/usr/bin/perl 
>     $m=~s/^.*\@//;

Это ж опять регексп, см.index+substr выше. Впрочем, перл всяко быстрее грепа, а заякорённый регексп должен быть даже быстрее index+substr.

> а ТС, если захочет, замерит, что там будет быстрее, чем

grep -vFf 
> domain mail
и насколько быстрее,