[Ruby] Re: [Ruby] Re: [Ruby] Re: [Ruby] Re: [Ruby] Re: [Ruby] IO.popen("cmd").readlines.grep(/str/) оставляет зомби
Sergei Olonichev
olonichev at scnsoft.com
Fri Apr 25 16:22:50 MSD 2003
Anton Farygin wrote:
> Sergei Olonichev пишет:
>
>> Alexander Bokovoy wrote:
>>
>>> On Fri, Apr 25, 2003 at 12:14:29PM +0300, Sergei Olonichev wrote:
>>>
>>>
>>>>>> 1. А почему нельзя использовать стандартный grep? Зачем изобретать
>>>>>> велосипеды?
>>>>>> 2. Наверное вы хотели написать /192[.]168[.]1[.]244/ а не
>>>>>> /192.168.1.244/ ?
>>>>>>
>>>>>> ipt=IO::popen("iptables -nvL FORWARD | grep /192[.]168[.]1[.]244/")
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> Системный греп не подходит,поскольку iptables|grep придется
>>>>> вызывать на каждый ИП-адрес.
>>>>> А так я все считываю в буфер и разбираю уже средствами
>>>>> руби.быстрее получается.
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> Если у вас много ip адресов то оба эти метода практически одинаково
>>>> неэффективны.
>>>>
>>>> Я бы посоветовал :
>>>>
>>>> 1. построить _одно_ регулярное выражение для _всех_ ip адресов, а
>>>> потом запускать iptables + grep (egrep).
>>>> 2. в руби просто строить hash: ip->info для всех возращаемых ip
>>>> адресов
>>>>
>>>> Тогда вам не придеться запускать пайп для каждого адреса.
>>>>
>>>
>>>
>>> А зачем вообще запускать внешний grep? Сергей, ты не объяснишь мне, что
>>> такое реально лучшее от этого будет?
>>>
>>>
>> По-моему так поще - потому что эту команду можно отладить отдельно от
>> всей программы.
>> А во-вторых я не вижу ничего плохого в использовании стандартных
>> средств совместно с Ruby.
>
>
> Это несколько не вместе.
>
> Т.е. - получается, что для того, что бы получить набор данных по
> нужному нам списку IP адресов мы должны:
>
> 1) Сформировать большое регулярное выражение
> 2) открыть pipe на grep
> 3) Забрать оттуда данные
>
> Вариант, который обсуждался ранее:
>
> 1) Открыть pipe на iptables
> 2) читать из pipe, обрабатывая регулярным выражением для каждого
> адреса из списка
>
> Мне кажется второй вариант несколько проще и быстрее.
>
> Rgds,
> Rider
>
Вообще-то я просто неправильно понял и подумал, что iptables вызывается
для каждого адреса, а то бы не предлагал. Но всеравно я счмитаю, что
использовать:
ipt1=ipt.grep(/192.168.1.244/)
не лучшее решение, т.к. для каждого шаблона приходится порсматривать
_весь_ текст заново.
А что если iptables вернет 1000 строк и у вас будет 1000 адресов, то ваш
алгоритм (если я не ошибаюсь) сделает 10^6 итераций, а мой 10^3.
Так что это ваш алгоритм медленее.
а сформировать общее регулярное выражение - не проблема темболее что это
делается один раз при зачитке кофигурационного файла
More information about the Ruby
mailing list