The OpenNET Project / Index page

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

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

"нужен совет"  
Сообщение от mesmeridze email on 08-Фев-09, 23:02 
Есть огромный access.log 56 млн. строк.
Есть справочник адресов сетей областей 274 строки всего 28 областей
Задача "разрезать" access.log так, чтобы сформировать файл для каждой из 28 областей.
Мой алгоритм, брать по очереди каждую строку из access.log извлекать оттуда адрес накладывать на него маску (взятую из файла областей) и сравнивать по очереди с каждой строкой справочника.
Проблема в том что скорость обработки одной строки около 2-3 секунд, что для файла лога такого объема абсолютно не годится.
Делаю таким скриптом:
#!/bin/sh

IPLIST=allip.sorted
MAP="structure.name.net.mask"
export IFS="
"

for IPSTRING in `cat $IPLIST`
do
        for MAPSTRING in `cat $MAP`
        do
                MAPNETWORK=`echo $MAPSTRING|awk '{print $2}'`
                MASK=`echo $MAPSTRING|awk '{print $3}'`
                IPNETWORK=`ipcalc -n \`echo ${IPSTRING}"/"${MASK}\`|sed s/NETWORK=//g`

                if [ ${MAPNETWORK} = ${IPNETWORK} ]
                then
                        MAPREGION=`echo $MAPSTRING|awk '{print $1}'`
                        echo $MAPREGION" "$MAPNETWORK" "$IPNETWORK" "$IPSTRING
                        break
                fi
        done
done
Если можете, подскажите, пожалуйста, как можно оптимизировать мою задачу?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

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


1. "нужен совет"  
Сообщение от v.i.t (??) on 09-Фев-09, 00:00 
а Perl религия не позволяет ?  
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "нужен совет"  
Сообщение от mesmeridze on 09-Фев-09, 10:57 
>а Perl религия не позволяет ?

эххх... если бы умел.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "нужен совет"  
Сообщение от Pahanivo email(ok) on 09-Фев-09, 07:54 
а если адресов в справочнике 10000 при 56 000 000 строк - 56х10^10 сравнений
неверный подход - перебор очень медленно
я например это делал двоичным делевом
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "нужен совет"  
Сообщение от angra (ok) on 09-Фев-09, 09:12 
Какие бинарные деревья? Не мечите бисер перед свиньями. Аффтар ниасилил даже вынесение подготовительных работ за пределы цикла и каждую итерацию заново парсит файл. Мало того, вместо одного вызова awk на весь $MAP файл он его вызывает дважды на каждую строку. Скрипт замечательный пример того как не надо программировать.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "нужен совет"  
Сообщение от mesmeridze on 09-Фев-09, 10:55 
>Скрипт замечательный пример того как
>не надо программировать.

можно подробнее описать что неправильно, ато я че-то непонел что я нетак сделал?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "нужен совет"  
Сообщение от angra (ok) on 09-Фев-09, 11:59 
Дык вроде же указал, ладно попробую с большим количеством слов.
1. Все неизменные действия нужно выносить из цикла, особенно это касается вызова внешних программ и чтения файлов. У вас же на каждую строку в IPLIST заново обрабатывается MAP, причем эта обработка не зависит от значения текущей строки из IPLIST. Обработайте MAP один раз и храните все данные в памяти.
2. Сам MAP тоже обрабатывается на редкость криво. Зачем на каждую его строку дважды вызывать awk, когда можно обойтись одним вызовом awk на весь файл? Пример
for MAPSTRING in `cat $MAP`
        do
                MAPNETWORK=`echo $MAPSTRING|awk '{print $2}'`
                MASK=`echo $MAPSTRING|awk '{print $3}'`
заменяем
awk '{print $2, $3}' $MAP | while read MAPNETWORK MASK; do
В данном случае конечно можно и вообще без awk обойтись, но это техника для общего случая.

Ну а теперь подсчитайте сколько у вас _лишних_ вызовов внешних программ получилось и не удивляйтесь почему так медленно работает.

Я мог бы написать вам вариант на perl, но вы конечно забыли предоставить формат входных и выходных данных, телепатией не владею, так что ССЗБ

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру