2015-10-15 45 views
2

我見過這個問題之前,也許這是我需要傳遞給另一種語言(理想情況下不),但我堅持試圖優化通過大型數組循環。PHP:加速一個非常大的循環

我有一個(可能)大2d數組,看起來像這樣。

[ 
    ['i am a string'] 
    ['i am also a string'] 
] 

我需要遍歷數組並計算所有單詞的實例。

這是當前的循環。

$words = []; 

foreach ($rows as $row) { 
    $text = explode(' ', $row); 

    foreach ($text as $word) { 
     if (isset($words[$word])) { 
      $words[$word]++; 
      continue; 
     } 

     $words[$word] = 1; 
    } 
} 

我已經與array_reducearray_map測試這一點,將其轉換爲話單(塊狀)陣列,通過array_count_values但到目前爲止,這foreach循環是做它的最快方式。

但我真的希望有一種更快的方式,我還沒有發現。

作爲參考,在這個例子中,我經歷了大約25萬字,但是這個數字在一天中增加了。

任何幫助表示讚賞!

+1

您是否在使用數據庫?你可以緩存結果,而不是每次都在飛行中計算它? – samlev

+1

您可能想嘗試['str_word_count'](http://php.net/manual/en/function.str-word-count.php) - 可以由C函數支持,該函數比爆炸和循環更有效通過文字。但是,這又是一個PHP,它可以很好地支持一些真正可怕的事情。 – max

+0

@samlev,我是,但從數據庫獲取它需要半秒鐘的時間,所以這不會造成足夠的備份來關注我。經過大量測試後,這個計數邏輯(以及所有其他我已經嘗試過的)會導致腳本運行很長時間。 – Scheda

回答

2

跳出來的第一件事是您使用foreach而不是countfor循環。預編碼的for循環通常比循環的foreach循環要快得多。某些測試結果見PHPBench.com

此外,你可能會更好使用二叉樹,而不是關聯數組。可能有數千個元素的關聯數組可能會導致巨大的內存和性能問題。

最後,正如其他人在評論中指出的,如果可能的話,緩存一些。如果你能確定至少有一些數據沒有改變,那麼這是一個經常執行的巨大計算。

+0

關於'str_word_count'速度的任何見解? – max

+0

@max我肯定會嘗試。可能快一點,但我沒有親自體驗基準來驗證。 –

+0

@EdCottrell - 現在這只是一種佔位符。我們正在開發新版本的統計應用程序,爲我們緩存所有這些數據,但在此之前,我們需要一些不會超時的負載平衡器,以便我們可以將這些數據顯示給客戶。 (增長問題ftw) – Scheda