Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2013 15:26:06

Voland
От:
Зарегистрирован: 2009-03-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение словарей по полю

Всем привет! Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена. Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов. Есть ли возможность оптимизировать скорость работы?
На вход поступает 2 csv файла, первый - выгрузка, второй - список ip, которые должны быть в первом.

# Compare 2 arrays of ip
import csv
import sys
res_csv_file = open('result.csv', 'wb')
fieldnames = [
    'start', 'end', 'time', 'IMSI', 'int_ip', 'int_port', 'trans_ip', 'trans_port', 'dst_ip', 'dst_port',
    'traffic']
reswriter = csv.DictWriter(res_csv_file, delimiter=';', fieldnames=fieldnames)
reswriter.writerow(dict((fn, fn) for fn in fieldnames))
src_csv_file = open(sys.argv[1], 'rb')
ip_csv_file = open(sys.argv[2], 'rb')
src_csv_dict = csv.DictReader(src_csv_file, delimiter=';', quotechar='"')
ip_csv_dict = csv.DictReader(ip_csv_file, delimiter=';', quotechar='"')
rows = list(src_csv_dict)
totalrows = len(rows)
print "Total values to check: %s " % (totalrows)
i = 0
src_csv_file.seek(0)
for req_ip in src_csv_dict:
    i += 1
    sys.stdout.write("Progress %s%%\r" % ((i * 100) / totalrows))
    sys.stdout.flush()
    ip_csv_file.seek(0)
    for host_ip in ip_csv_dict:
        if req_ip['dst_ip'] in host_ip.values():
            reswriter.writerow(req_ip)
print "Job completed"



Офлайн

#2 Окт. 17, 2013 16:29:37

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Пересечение словарей по полю

из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение

Офлайн

#3 Окт. 17, 2013 19:29:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Пересечение словарей по полю

Voland
src_csv_file.seek(0)
в чём смысл этой строки ?
удали её везде

Voland
Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена.
приведи пример исходных данных (файл с данными, список исключений)
приведи пример результата

Voland
Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов.
все сейчас будут догадываться, какие массивы ты имеешь в виду, читая этот код полчаса
сам же его и не поймёшь через полгода

Voland
        if req_ip['dst_ip'] in host_ip.values():
во-во, все должны телепатически догадаться, какие там структуры данных



Отредактировано py.user.next (Окт. 17, 2013 19:32:02)

Офлайн

#4 Окт. 18, 2013 08:49:56

Voland
От:
Зарегистрирован: 2009-03-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пересечение словарей по полю

py.user.next
src_csv_file.seek(0)
Эта строка нужна для работы цикла for req_ip in src_csv_dict:
bismigalis
из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение
Спасибо, действительно, работает на порядок быстрее



Отредактировано Voland (Окт. 18, 2013 08:51:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version