Найти - Пользователи
Полная версия: Как ускорить работу скрипта? (parsing log SQUID)
Начало » Python для новичков » Как ускорить работу скрипта? (parsing log SQUID)
1
grok
Добры день!

Тема: Обработка лог файла кэширующего прокси-сервера 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 часов (Просто ужас!!!).

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

Спасибо =)
slav0nic
http://www.dabeaz.com/generators/ почитай, 2й часть презентации, может поможет
и в каком месте тупит? небось сортировка? профайлер потыкай python -m cProfile parser.py
http://docs.python.org/library/profile.html
grok
slav0nic
http://www.dabeaz.com/generators/ почитай, 2й часть презентации, может поможет
Спасибо, почитаю, может действительно поможет.)
slav0nic
и в каком месте тупит? небось сортировка?
Он не тупит, довольно-таки длительно на мой взгляд он проверяет принадлежность ip-адреса к томским сетям.
А вот в сортировке словарей, он работает шустренько, нареканий нет. =)
slav0nic
тогда как вариант - кешируй по IP этот участок
grok
slav0nic
тогда как вариант - кешируй по IP этот участок
Каким образом организовать КЭШ? Ни разу с ним не работал. Goggle выдаёт по большому случаю кэширование на web-серверах..
slav0nic
ну типа
...
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 раз проверять
grok
slav0nic
зы: не надо один и тот же IP по 100 раз проверять
Да, недавно такая же мысль возникла ))

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

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

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

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

P.S. Респект slav0nic
o7412369815963
сначала посчитать трафик, а в конце разложить на local \ extern

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

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

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

З.Ы. Всем большое спасибо!)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB