2010-12-20 93 views
1

我必須創建一個文件,其中一個充滿關鍵字序列(約20k行),另一個充滿正則表達式(〜2.5k)。foreach和preg_match上的大量數據無法正常工作

我想用每個正則表達式測試每個關鍵字並打印出匹配的關鍵字。我測試了我的文件,這大約產生了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和count顯示,一切正常。

我認爲這是由於要處理的數據量過大,但我想知道是否有我沒有遵循的那類操作的建議。我使用的正則表達式非常複雜,我無法改變其他的東西。

想法任何人?

+1

你應該顯示一個關鍵字的樣本(這實際上是在這裏形成主題?)和正則表達式。 – mario 2010-12-20 11:01:22

+0

另外:你只是對比賽計數感興趣,還是對比賽本身感興趣? – Tomalak 2010-12-20 11:02:43

+0

顯示關鍵字示例將是無關緊要的,因爲它只是通過搜索引擎進行的查詢。正則表達式檢查查詢中是否存在特定的產品名稱,並顯示相應的廣告。 – 2010-12-20 11:14:52

回答

-1

提高執行時間在.htaccess

php_value max_execution_time 80000 
+0

或者只是'ini_set('max_execution_time',80000);'在腳本 – seriousdev 2010-12-20 11:31:14

+0

''我猜'ini_set('max_execution_time',0);'是更正確的,因爲它允許無限的執行時間。無論如何,這是暫時解決我的問題。謝謝 ! – 2010-12-20 11:53:53

2

usethis線有兩種優化選項:

  • 正則表達式通常可以組合成替代/(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

您的第一個解決方案會產生一個4'000'000字符長的正則表達式字符串,preg_match似乎無法應對!至於第二種解決方案,似乎沒有更快的運行速度,但速度並不是這裏的主題。然而,我會記住這一點!謝謝:-) – 2010-12-20 11:59:46

+0

@Gaël:這是4MB的字符串,這不是很好的開始。正則表達式可以很容易地處理這個問題,並且比一個循環的循環更有效。雖然增加腳本的執行時間可能會解決您的緊急問題,但解決方案的存在很可能會超過您的方法幾個數量級。這個答案指向了正確的方向。 – Tomalak 2010-12-20 12:20:57

+0

@Tomalak這就是爲什麼我接受這個答案,指出這是一個臨時解決方案。由於我只會在數據收集完成時執行一次或兩次該腳本,因此它不需要真正的優化,而只是直到文件結束才工作:-) – 2010-12-20 12:29:13