Задать вопрос
Leksnsk
@Leksnsk

Как распарсить большое количество логов?

Доброго времени суток.

Как лучше всего подойти к задаче парсинга большого объема csv логов звонков (~ 12-15 ГБ), что бы получить максимальную скорость обработки данных?
Логи представляют из себя набор данных - "время, имя, длительность".
По итогу надо для каждого уникального имени получить суммарную длительность.

Таким скриптом на pyhton считалось > 2 часов, хотелось бы побыстрее:

import sys
import re

d = {}

for line in sys.stdin:
                        NameRE = re.compile("NAME=(\w+)")
                        TimeRE = re.compile("TIME=(\d+)")
                        if NameRE.search(line):
                                Name = str(NameRE.search(line).group(1))
                                Time = int(TimeRE.search(line).group(1))
                        if Name in d:
                                Time += d[Name]
                                d[Name] = Time
                        else:
                                d[Name] = Time
for k in d:
        print '%s  %s' % (k, d[k])
  • Вопрос задан
  • 2440 просмотров
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 8
@kshvakov
В БД положите

Для MySQl LOAD DATA INFILE (dev.mysql.com/doc/refman/5.7/en/load-data.html)
Для PostgreSql COPY (www.postgresql.org/docs/9.3/static/sql-copy.html)

Или можно в SQLite
Ответ написан
@neol
- re.compile нужно вынести из цикла.
- сделать из двух регулярок одну и вместо трех вызовов search делать один.
- убрать бесполезное преобразование str(NameRE.search(line).group(1))
Ответ написан
@protven
Посмотрите в сторону Apache Spark. Я летом проходил курс по нему
https://courses.edx.org/courses/BerkeleyX/CS100.1x...

там одной из первых лабораторок была как раз задача на парсинг логов Апача.
Спарк во-первых гораздо более человеко-любив, чем Хадуп и проще в основении.
Во-вторых за счет того, что можно хранить все данные в памяти скорее всего будет быстрее, если у вы выделите под него машины с достаточным объемом RAM. В общем я бы советовал потратить пару часов на изучение, в том курсе, который я скинул дается готовый Vagrantfile. Скачиваете сам Vagrant, потом Virtualbox, делаете vagrant up и у вас готовое окружение, можно пробовать решать ваша задачу.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Ответ написан
Комментировать
@Swartalf
Немного не по теме, но если у вас линукс и нужно перебирать большие csv, то не проще ли использовать awk?
Прирост в скорости будет очень и очень заметным.
Ответ написан
@beduin01
Вот статейку прочитайте, там примеры есть tech.adroll.com/blog/data/2014/11/17/d-is-for-data...
Ответ написан
Комментировать
2ord
@2ord
Если вопрос по коду, то в дополнение к neol могу добавить ещё
d[Name] = Time почему-то присутствует в обеих ветвях if, else что неоптимально.

Если вопрос по выбору подходящего инструмента, то альтернативой собственному скрипту можно также попробовать тот же Apache Spark.
Ответ написан
Комментировать
@wegners
Добрый день, если в логах нет секретных данных, не могли бы выложить для теста скрипта? И какого вида результат вам нужен?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы