Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 29, 2010 10:31:59

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

Добры день!

Тема: Обработка лог файла кэширующего прокси-сервера squid и получение на выходе статистической информации.
Задача: Студент подготавливает файл томских сетей в виде ip/mask. На выходе выдать два файла, трафик по томским и внешним сетям.
Сам лог файл весит 340 Мб с копейками; в нём порядка 2.600.000 строк.

Мой скрипт:

import sys
sys.path.append('/home/adv/gks/lab 5/iplib.py')
import iplib

f = open("/home/adv/gks/laba 5/netsplain", 'r')
ip_mask = []
for line in f:
ip_mask.append(line.strip())
f.close()

internal, external = {}, {}

f = open("/home/adv/gks/laba 5/squid", 'r')

for line in f:
parts = line.strip().split(' ')

time, byte, ip = parts[0], parts[4], parts[7]

if iplib.detect(ip) == 1:
a, b = 0, 0
for element in ip_mask:
cidr = iplib.CIDR(element)
if cidr.is_valid_ip(ip):
a += 1
else:
b += 1
if a == 1:
internal[ip] = internal.get(ip, 0) + int(byte)
else:
external[ip] = external.get(ip, 0) + int(byte)

f.close()


f = open("/home/adv/gks/laba 5/internal", 'w')
for key, value in sorted(internal.items(),
key = lambda x: x[1],
reverse = True):
f.write(str(key).rjust(15) + " " + str(value) + "\n")
f.close()

f = open("/home/adv/gks/laba 5/external", 'w')
for key, value in sorted(external.items(),
key = lambda x: x[1],
reverse = True):
f.write(str(key).rjust(15) + " " + str(value) + "\n")
f.close()
А теперь собственно сам вопрос: Как ускорить работу скрипта, то есть какие функции можно в нём заменить или уменьшить количество циклов, дабы он быстрее стал работать. На данный момент время работы скрипта около 30 часов (Просто ужас!!!).

И есть ли где-нибудь описание затрат времени на работу той или иной функции?

Спасибо =)



Офлайн

#2 Окт. 29, 2010 10:56:42

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

http://www.dabeaz.com/generators/ почитай, 2й часть презентации, может поможет
и в каком месте тупит? небось сортировка? профайлер потыкай python -m cProfile parser.py
http://docs.python.org/library/profile.html

Офлайн

#3 Окт. 29, 2010 11:05:02

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

slav0nic
http://www.dabeaz.com/generators/ почитай, 2й часть презентации, может поможет
Спасибо, почитаю, может действительно поможет.)
slav0nic
и в каком месте тупит? небось сортировка?
Он не тупит, довольно-таки длительно на мой взгляд он проверяет принадлежность ip-адреса к томским сетям.
А вот в сортировке словарей, он работает шустренько, нареканий нет. =)



Офлайн

#4 Окт. 29, 2010 11:19:03

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

тогда как вариант - кешируй по IP этот участок

Офлайн

#5 Окт. 29, 2010 11:58:22

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

slav0nic
тогда как вариант - кешируй по IP этот участок
Каким образом организовать КЭШ? Ни разу с ним не работал. Goggle выдаёт по большому случаю кэширование на web-серверах..



Офлайн

#6 Окт. 29, 2010 12:21:01

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

ну типа

...
ip_dict = {}
....
if ip not in ip_dict:
for element in ip_mask:
....
if cidr.is_valid_ip(ip):
ip_dict[ip] = True
else:
ip_dict[ip] = False
зы: не надо один и тот же IP по 100 раз проверять

Офлайн

#7 Окт. 29, 2010 12:24:43

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

slav0nic
зы: не надо один и тот же IP по 100 раз проверять
Да, недавно такая же мысль возникла ))

Спасибо Вам :)

————————————————————

Удалось снизить время работы скрипта!! Просто шикарно! =)

Время “Определение принадлежности ip-адреса к томским сетям”: 0:04:05.598663
Время “Сортировка и вывод ”: 0:00:00.048745

P.S. Респект slav0nic



Отредактировано (Окт. 29, 2010 13:38:21)

Офлайн

#8 Окт. 29, 2010 13:37:48

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

сначала посчитать трафик, а в конце разложить на local \ extern

зачем сортировать? выдать так.

если сортировать то сделать числовой ключ,

и врубить psyco

Офлайн

#9 Окт. 29, 2010 13:41:14

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Как ускорить работу скрипта? (parsing log SQUID)

o7412369815963
зачем сортировать? выдать так.
Это как редвиденье того, что потребует преподаватель) Он очень любит, когда все отсортировано, к тому же время сортировки не занимает и секунды;)

З.Ы. Всем большое спасибо!)



Отредактировано (Окт. 29, 2010 13:43:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version