Что лучший способ состоит в том, чтобы проанализировать тело текста против нескольких (15 +) regexes на каждой строке?

Вам не нужно изменять какие-либо записи в AWS, поскольку вы используете Cloudflare в качестве службы DNS.
Cloudflare дает вам возможность изменять настройки зоны DNS, добавлять A, CNAME и другие записи.

Просто получите общедоступный IP-адрес для экземпляра-2 с консоли AWS, войдите в Cloudflare, откройте редактор зоны DNS своего домена и добавьте запись A с именем своего субдомена, указывающего на IP-адрес второго экземпляра.

ОБНОВЛЕНИЕ: в вашей конфигурации cloudflare оно должно выглядеть следующим образом:

Type           Name           Value                                   TTL        
    A        mydomainname.com     points to 13.232.XXX.XXX          Automatic
    A        subdomain            points to 123.123.123.123          Automatic       
    CNAME    test                 is an alias of mydomainname.com    Automatic      
    CNAME    www                  is an alias of mydomainname.com    Automatic      
    TXT      mydomainname.com     ca3-b78797cee2b346558bf7a891ff5bd5daXX Automatic
8
задан 14 revs, 3 users 65% 23 May 2017 в 11:53
поделиться

10 ответов

Я предложил бы

Удачи

7
ответ дан 5 December 2019 в 11:28
поделиться

Повышение. Дух является фантастической библиотекой, которая позволяет Вам делать подробный анализ синтаксического анализатора, и так как синтаксический анализатор сгенерирован и скомпилировал прямо в Ваш код, должно быть намного быстрее, чем динамично вычисленное решение. Синтаксис главным образом сделан с шаблонами выражения (необычный термин для большого количества перегруженных операторов), что означает, что Вы на самом деле пишете им прямо в Ваш код.

4
ответ дан 5 December 2019 в 11:28
поделиться

Вот один способ сделать его при использовании Perl.
скопированный с perldoc perlfaq6

while (<>) {
    chomp;
    PARSER: {
        m/ \G( \d+\b    )/gcx   && do { print "number: $1\n";  redo; };
        m/ \G( \w+      )/gcx   && do { print "word:   $1\n";  redo; };
        m/ \G( \s+      )/gcx   && do { print "space:  $1\n";  redo; };
        m/ \G( [^\w\d]+ )/gcx   && do { print "other:  $1\n";  redo; };
    }
}

Для каждой строки, PARSER цикл сначала пытается соответствовать серии цифр, сопровождаемых границей слова. Этот матч должен начаться в месте последнее брошенное соответствие (или начало строки на первом соответствии). С тех пор m/ \G( \d+\b )/gcx использование c флаг, если строка не соответствует тому регулярному выражению, жемчуг, не сбрасывает pos() и следующий матч начинается в том же положении пробовать другой шаблон.

2
ответ дан 5 December 2019 в 11:28
поделиться

Посмотрите, что Регулярное выражение Соответствовать Может Быть Простым И Быстрым (но является медленным в Java, Perl, PHP, Python, Ruby...). В зависимости от объема Ваших данных и насколько сложный Ваш regex, это могло бы быть просто быстрее для записи собственной логики синтаксического анализа.

1
ответ дан 5 December 2019 в 11:28
поделиться

Я небрежно читал на ШТЕПСЕЛЯХ и основанном на грамматике парсинге, но выглядит несколько трудным реализовать. Действительно ли это - направление, которое я должен возглавить или являюсь там различными маршрутами?

Лично я вырос для любви ШТЕПСЕЛЕЙ. Возможно, потребуется немного для получения довольным ими, однако я думаю, что они настолько более удобны в сопровождении, что это - ясная победа. Я нахожу, что код парсинга является источником большого количества неожиданных ошибок, поскольку Вы находите новые пограничные случаи в исходных данных. Декларативные грамматики с нетерминалами легче для меня обновить, когда это происходит по сравнению с циклом и условием тяжелый код regex. Именование мощно.

В Ruby существует Верхушка дерева, которая является парсером-генератором, который использует ШТЕПСЕЛИ. Я недавно нашел это довольно приятным в замене regex тяжелого рукописного синтаксического анализатора с короткой грамматикой.

1
ответ дан 5 December 2019 в 11:28
поделиться

Соответствия регулярного выражения когда-либо накладываются? Таким образом, когда два или больше regexes соответствуют той же строке, они всегда соответствуют различным частям строки (никакое перекрытие)?

Если соответствия никогда не перекрывают, запускают Ваш поиск с помощью одного регулярного выражения, которое комбинирует 15 regexes, Вы имеете теперь:

regex1|regex2|regex3|...|regex15

Используйте группы фиксации, если необходимо смочь определить, какой из 15 regexes соответствовал.

Поиск Ваших данных однажды для длинного regex будет быстрее, чем поиск его 15 раз. Сколько быстрее зависит от regex механизма, Вы используете и сложность Ваших регулярных выражений.

0
ответ дан 5 December 2019 в 11:28
поделиться

Попробуйте простой тест на Perl. Читайте о функции «изучение». Я мог бы попробовать:

  • Читать весь файл или большое количество строк, если эти файлы очень велики в одну строку
  • Добавлять номер строки в начало каждой строки по ходу.
  • " Изучите "струну". Это создает таблицу поиска за символом, может быть большим.
  • Запускать совпадения регулярных выражений в строке, ограниченной символами новой строки (используйте модификаторы регулярных выражений m и s). Выражение должно извлечь номер строки вместе с данными.
0
ответ дан 5 December 2019 в 11:28
поделиться

Еще одна идея, если у вас есть для этого элегантный четырехъядерный или восьмиъядерный основной сервер.

Создайте конвейер обработки это разделяет работу. Первый этап может разрезать файлы в одну игру или раздачу, а затем записывать каждый из них в один из восьми каналов второго этапа, которые читают данные, обрабатывают их и каким-то образом выводят, возможно, в базу данных на другом компьютере.

По моему опыту эти многопроцессорные конструкции на основе труб почти так же быстры и намного легче отлаживаются, чем многопоточные. Также было бы легко настроить кластер машин, используя сетевые сокеты вместо каналов.

0
ответ дан 5 December 2019 в 11:28
поделиться

Для проблемы как это я просто закрыл бы глаза и использовал бы генератор Lexer+Parser. Можно победить это ручной оптимизацией, вероятно, но намного легче использовать генератор. Кроме того, это - путь, более гибкий, когда вход внезапно изменяется.

0
ответ дан 5 December 2019 в 11:28
поделиться

Хорошо, это делает вещи более ясными (Истории покерной комбинации). Я предполагаю, что Вы делаете инструмент статистики (фактор агрессии, перешел к откровенному обмену мнениями, добровольно помещенному $ в горшок и т.д.). Я не уверен, почему Вам нужны повышенные скорости для этого; даже если Вы мультипредставляете в виде таблицы с 16 таблицами, руки должны только щекотать в на умеренном уровне.

Я не знаю Ruby, но в Perl я сделал бы немного оператора переключения, в то же время, что и, получив значительные части в 1$, 2$ и т.д. По моему опыту, это не медленнее, чем создание сравнений строк и затем разделение строки с другими средствами.

HAND_LINE: for ($Line)
    { /^\*\*\* ([A-Z ]+)/ and do 
        { # parse the string that is captured in $1
          last HAND_LINE; };
      /^Dealt to (.+) \[(.. ..)\]$/ and do
        { # $1 contains the name, $2 contains the cards as string
          last HAND_LINE; };
      /(.+) folds$/ and do
        { # you get the drift
          last HAND_LINE; }; };

Я делаю не думают, что можно действительно сделать его быстрее. Поместите проверки на строки, которые происходят больше всего в первом положении (вероятно, операторы сгиба) и те, которые только происходят редко наконец (начинающий нового человека, "*** NEXT PHASE ***").

Если Вы узнаете, что фактическое чтение файла является узким местом, можно, возможно, смотреть, в каких модулях можно использовать для обращения к большим файлам; для Perl, Tie::File приходит на ум.

Удостоверьтесь, что Вы читаете каждую руку только однажды. Не считывайте все данные снова после каждой руки, вместо этого сохраняйте, например, хеш-таблица ручных идентификаторов уже проанализированными.

0
ответ дан 5 December 2019 в 11:28
поделиться
Другие вопросы по тегам:

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