foreach и preg_match для большого количества данных, которые не работают должным образом - PullRequest
1 голос
/ 20 декабря 2010

У меня есть файлы, одна полна последовательностей ключевых слов (~ 20 тыс. Строк), другая полна регулярных выражений (~ 2,5 тыс.).

Я хочу проверить каждое ключевое слово с каждым регулярным выражением и распечататьтот, который соответствует.Я проверил свои файлы, и это составляет около 22 750 000 тестов.Я использую следующий код:

$count = 0;
$countM = 0;
foreach ($arrayRegexp as $r) {
    foreach ($arrayKeywords as $k) {
        $count++;
        if (preg_match($r, $k, $match) {
            $countM++;
            echo $k.' matched with keywords '.$match[1].'<br/>';
        }
    }
}
echo "$count tests with $countM matches.";

К сожалению, после некоторого времени вычислений отображаются только части фактических совпадений, а последняя строка с подсчетами никогда не отображается.Что еще более странно, так это то, что если я прокомментирую раздел preg, чтобы сохранить только два foreach и отображение количества, все будет работать нормально.

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

Идеи кому-нибудь?

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Существует два варианта оптимизации:

  • Регулярные выражения обычно можно объединить в альтернативы /(regex1|regex2|...)/.Часто PCRE может оценивать альтернативы быстрее, чем PHP может выполнить цикл.
  • Я не уверен, что это вообще быстрее (изменяет темы), но вы можете использовать массив ключевых слов в качестве параметра непосредственно для preg_replace_callback ()таким образом исключая второй цикл.

Как пример:

 $rx = implode("|", $arrayRegexp);  // if it hasn't /regexp/ enclosures

 preg_replace_callback("#($rx)#", "print", $arrayKeywords);

Но определите пользовательскую функцию печати для вывода и подсчета результатов, и пусть она просто возвращает, например, пустую строку.

Если подумать, preg_replace_callback также будет принимать массив регулярных выражений.Не уверен, что он перепроверяет каждое регулярное выражение в каждой строке.

0 голосов
/ 20 декабря 2010

Увеличить время выполнения

использовать эту строку в .htaccess

php_value max_execution_time 80000
...