У меня есть текст, который мне нужно отсканировать, и каждая строка содержит как минимум 2, а иногда и четыре части информации. Проблема в том, что в каждой строке может быть 1 из 15-20 различных действий.
в ruby текущий код выглядит примерно так:
text.split("\n").each do |line| #around 20 times..
..............
expressions['actions'].each do |pat, reg| #around 20 times
.................
Это, очевидно, «ПРОБЛЕМА».
Мне удалось сделать это быстрее (в C ++ с 50% -ным запасом), объединив все регулярные выражения в одно, но это все еще не та скорость, которая мне требуется - мне нужно быстро проанализировать тысячи этих файлов!
Сейчас я сопоставляю их с регулярными выражениями - однако это невыносимо медленно. Я начал с ruby и переключился на C ++ в надежде, что получу повышение скорости, а этого просто не происходит.
Я случайно прочитал о разборке PEG и грамматики, но это выглядит довольно сложно для реализации. Это направление, в котором я должен идти, или есть разные маршруты?
В основном я анализирую истории покерных рук, и каждая строка истории рук обычно содержит 2-3 бита информации, которую мне нужно собрать:
кто был игроком, сколько денег или какие карты принесло действие .. и т.д ..
Пример текста, который необходимо проанализировать:
buriedtens posts $5
The button is in seat #4
*** HOLE CARDS ***
Dealt to Mayhem 31337 [8s Ad]
Sherwin7 folds
OneMiKeee folds
syhg99 calls $5
buriedtens raises to $10
После сбора этой информации каждое действие превращается в узел xml.
Сейчас моя реализация в ruby намного быстрее, чем в C ++, но это проблематично. Просто потому, что я не писал в коде c более 4-5 лет
UPDATE:
Я не хочу размещать здесь весь код, но пока мои руки / секунды выглядят следующим образом:
588 hands/second -- boost::spirit in c++
60 hands/second -- 1 very long and complicated regex in c++ (all the regexen put together)
33 hands/second -- normal regex style in ruby
В настоящее время я тестирую antlr, чтобы посмотреть, сможем ли мы пойти дальше, но на данный момент я очень доволен результатами духа.
Смежный вопрос: Эффективный запрос одной строки для нескольких регулярных выражений.