Форум сайта python.su
Добрый день!
Есть текстовый файл с предложениями, размером 10Гб
Подскажите, как реализовать скоростную выборку по регулярным выражениям ?
Офлайн
Ну, соображение здесь вот такого плана - пропустить последовательно через регулярки этот текстовик, от общего к частному, что называется.
То есть, пусть у нас есть текстовый файл на 10 гигабайт, из которого нужны даты, скажем, с 2001 года по 2005.
Сначала просто пишем регулярку на все даты вида dd-mm-yyyy - что-то вроде \d\d-\d\d -d\d\d\d,
а уже потом из этого подрезультата ищем нужные нам даты. Это быстрее, чем если бы мы сразу искали нужные даты из текстовика.
Отредактировано (Янв. 15, 2012 16:35:20)
Офлайн
Ещё можно разделить текстовик на части и параллельно вести поиск по регуляркам, с помощью потоков в python,
но стоит сперва обосновать такой подход ( например, нельзя придумать ничего лучше и дешевле по производительности )
Офлайн
нет, там предложения, и их нужно вырезать по определенным словам / частям слов.
Я сделал поиск по двум словам через рег. выражение, уже сутки работает …
Ищу по рег. выражениям:
(.*)авто.агаз(.*)
(.*)avto.aga(.*)
может медленно работает из-за приведения к юникоду, но в utf-8 поиск не срабатывал.
ищу так:
key_filter = [re.compile(x.decode("utf-8"), re.I) for x in read_lines(key_filter)]
for line in open(src, "r"):
try:
mline = line.decode("utf-8").lower().strip(" \r\n")
if mline not in keywords:
if any([x.match(mline) for x in key_filter]):
keywords.append(mline)
f_dst.write(line)
f_dst.flush()
count +=1
print count
except UnicodeError:
f_dst_err.write(line)
f_dst_err.flush()
Отредактировано (Янв. 15, 2012 16:52:18)
Офлайн
У меня поиск в файле 500 мег
2.8469911919 секунды вместе с чтением
import re
import time
rr=re.compile("mama.+$")
t0=time.clock()
s=open(r"Arh3b.dat","rb").read()
res=rr.findall(s)
t1=time.clock()
print t1-t0
Отредактировано (Янв. 15, 2012 19:43:55)
Офлайн