2013-04-20 2 views
2

Все, Я довольно новый и ищу помощь. Мне нужно выполнить строковый поиск в наборе данных, который сжал около 20 ГБ данных. У меня есть восьмиъядерный ящик ubuntu с 32 ГБ ОЗУ, который я могу использовать для этого, но я не могу реализовать и не определить наилучший возможный код для такой задачи. Будет ли Threading или многопроцессорная обработка лучше всего для такой задачи? Просьба представить образцы кода. Спасибо. См. Мой текущий код;Python for loop с использованием Threading или многопроцессорной обработки

#!/usr/bin/python 
import sys 
logs = [] 
iplist = [] 

logs = open(sys.argv[1], 'r').readlines() 
iplist = open(sys.argv[2], 'r').readlines() 
print "+Loaded {0} entries for {1}".format(len(logs), sys.argv[1]) 
print "+Loaded {0} entries for {1}".format(len(iplist), sys.argv[2]) 

for a in logs: 
    for b in iplist: 
     if a.lower().strip() in b.lower().strip() 
      print "Match! --> {0}".format(a.lower().strip()) 
+2

Я не уверен, что Python - это инструмент для вашей задачи. Почему бы вам просто не загрузить их в sqlite или что-то еще? –

+0

Прошу прощения, но не могли бы вы объяснить свои рассуждения? Я действительно думал, что это будет хорошим вариантом для Python. – noobie

+0

Ну, это было бы легко сделать в SQL, но, безусловно, возможно в Python. Есть ли только два гигантских файла или множество небольших файлов? – reptilicus

ответ

1

Я не уверен, если многопоточный режим может помочь вам, но ваш код имеет проблему, которая плохо сказывается на производительности: чтение журналов в один идти потребляет невероятное количество оперативной памяти и лупит кэш. Вместо этого откройте его и прочитайте его последовательно, ведь вы делаете последовательное сканирование, не так ли? Затем не повторяйте никаких операций с одними и теми же данными. В частности, iplist не изменяется, но для каждой записи в журнале вы повторно вызываете b.lower().strip(). Сделайте это один раз, прочитав файл с IP-адресами.

Короче говоря, это выглядит следующим образом:

with open(..) as f: 
    iplist = [l.lower().strip() for l in f] 

with open(..) as f: 
    for l in f: 
     l = l.lower().strip() 
     if l in iplist: 
      print('match!') 

Вы можете улучшить производительность даже больше, используя набор для IPList, потому что, глядя вещи вверх будет быстрее, когда есть много элементов. Тем не менее, я предполагаю, что второй файл огромен, а iplist останется относительно небольшим.

BTW: Вы можете улучшить производительность с помощью нескольких процессоров, используя один для чтения файла, а другой для сканирования совпадений, но я думаю, что вышеупомянутое уже даст вам достаточный прирост производительности.

+0

Спасибо, ребята, я прочитаю эти рекомендации! – noobie

Смежные вопросы