The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

форумы  помощь  поиск  регистрация  вход/выход  слежка  RSS
"помогите с простенькой задачкой"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"помогите с простенькой задачкой"  –2 +/
Сообщение от visitor (ok) on 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 работает ужасно долго при больших листах - уверен перл справиться намного быстрее.

Спасибо!

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "помогите с простенькой задачкой"  +/
Сообщение от Led (ok) on 14-Янв-17, 21:27 
Это в каком классе сейчас такие примитивные задачки сейчас задают?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "помогите с простенькой задачкой"  +/
Сообщение от михалыч (ok) on 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"};
}


насчет жручести памяти в перле будем считать тебя предупредили выше
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "помогите с простенькой задачкой"  +/
Сообщение от Andrey Mitrofanov on 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 не будем показывать!

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

6. "помогите с простенькой задачкой"  +/
Сообщение от михалыч (ok) on 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
и насколько быстрее,

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

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

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

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

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

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

grep -vFf 
> domain mail
и насколько быстрее,
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor