Найти - Пользователи
Полная версия: Скоростная выборка текста из 10Гб файла
Начало » Python для экспертов » Скоростная выборка текста из 10Гб файла
1
rustamakhmetov
Добрый день!

Есть текстовый файл с предложениями, размером 10Гб

Подскажите, как реализовать скоростную выборку по регулярным выражениям ?
Spectral
Ну, соображение здесь вот такого плана - пропустить последовательно через регулярки этот текстовик, от общего к частному, что называется.
То есть, пусть у нас есть текстовый файл на 10 гигабайт, из которого нужны даты, скажем, с 2001 года по 2005.
Сначала просто пишем регулярку на все даты вида dd-mm-yyyy - что-то вроде \d\d-\d\d -d\d\d\d,
а уже потом из этого подрезультата ищем нужные нам даты. Это быстрее, чем если бы мы сразу искали нужные даты из текстовика.
Spectral
Ещё можно разделить текстовик на части и параллельно вести поиск по регуляркам, с помощью потоков в python,
но стоит сперва обосновать такой подход ( например, нельзя придумать ничего лучше и дешевле по производительности )
rustamakhmetov
нет, там предложения, и их нужно вырезать по определенным словам / частям слов.
Я сделал поиск по двум словам через рег. выражение, уже сутки работает …

Ищу по рег. выражениям:
(.*)авто.агаз(.*)
(.*)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()
doza_and
У меня поиск в файле 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
те на ваших объемах где-то будет минута.

резать файл на куски.
Преобразования
mline = line.decode(“utf-8”).lower().strip(“ \r\n”)
убрать в ключи регулярного выражения
поиск не начинать с (.*)авто.агаз от этого ему худо.

Если находится много экземпляров
то
f_dst.flush() вполне может объяснить работу в течении суток

для поиска конечно желательно использовать не findall а finditer
res=rr.findall(s)
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