Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2012 14:36:27

rustamakhmetov
От:
Зарегистрирован: 2011-07-12
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Скоростная выборка текста из 10Гб файла

Добрый день!

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

Подскажите, как реализовать скоростную выборку по регулярным выражениям ?



Офлайн

#2 Янв. 15, 2012 16:32:29

Spectral
От:
Зарегистрирован: 2010-07-13
Сообщения: 51
Репутация: +  1  -
Профиль   Отправить e-mail  

Скоростная выборка текста из 10Гб файла

Ну, соображение здесь вот такого плана - пропустить последовательно через регулярки этот текстовик, от общего к частному, что называется.
То есть, пусть у нас есть текстовый файл на 10 гигабайт, из которого нужны даты, скажем, с 2001 года по 2005.
Сначала просто пишем регулярку на все даты вида dd-mm-yyyy - что-то вроде \d\d-\d\d -d\d\d\d,
а уже потом из этого подрезультата ищем нужные нам даты. Это быстрее, чем если бы мы сразу искали нужные даты из текстовика.



Отредактировано (Янв. 15, 2012 16:35:20)

Офлайн

#3 Янв. 15, 2012 16:40:24

Spectral
От:
Зарегистрирован: 2010-07-13
Сообщения: 51
Репутация: +  1  -
Профиль   Отправить e-mail  

Скоростная выборка текста из 10Гб файла

Ещё можно разделить текстовик на части и параллельно вести поиск по регуляркам, с помощью потоков в python,
но стоит сперва обосновать такой подход ( например, нельзя придумать ничего лучше и дешевле по производительности )



Офлайн

#4 Янв. 15, 2012 16:46:34

rustamakhmetov
От:
Зарегистрирован: 2011-07-12
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Скоростная выборка текста из 10Гб файла

нет, там предложения, и их нужно вырезать по определенным словам / частям слов.
Я сделал поиск по двум словам через рег. выражение, уже сутки работает …

Ищу по рег. выражениям:
(.*)авто.агаз(.*)
(.*)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)

Офлайн

#5 Янв. 15, 2012 19:31:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Скоростная выборка текста из 10Гб файла

У меня поиск в файле 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)



Отредактировано (Янв. 15, 2012 19:43:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version