2015-11-15 37 views
3

比方說,我想跟蹤的時候出現一個詞數...如何計算非常大的數據集發生與PHP

//Update the totals 
foreach($arrayOfWords as $word) { 
    $totals[$word] = $totals[$word] + 1; 
} 

現在,想象一下,認爲這個代碼的小塊被稱爲數百次,每次每次在$ arrayWords中有數千個新單詞,導致數百萬條目在關聯數組$ total中。儘管操作很簡單(將現有值加1),但當我們接近數百萬個條目時,PHP速度顯着下降。

你可以想一個更好的方法來統計事件(最好不使用數據庫)嗎?

+1

[array_count_values()](http://www.php.net/manual/en/function.array-count-values.php)是內置的函數,將爲你做這....但如果不使用數據庫來處理千百個字的話,將不會有快速的解決方案....你會首先用盡內存 –

+0

也許看看[generators](http ://php.net/manual/en/language.generators.php) – quickshiftin

+0

@quickshiftin - 出於興趣,你將如何使用生成器來做到這一點? –

回答

2

下面就來加快它

//Update the totals 
foreach($arrayOfWords as $word) { 
    $totals[$word]++; 
} 

無需搜索相同關鍵字的散列內連續兩次只是爲了增加其價值的一種方式。另外,(只是一個筆記)我看不出$totals的長度如何超過$arrayOfWords的長度,除非您在代碼中的其他位置添加單詞$totals

+0

我會盡力提高速度:) – user353877

+0

$總計會繼續增長,因爲在代碼中,我們將繼續獲得一批新的$ arrayOfWords,然後再次調用那個小foreach循環 – user353877

+0

也許在這種情況下,如果您顯示我們有更多的代碼可以幫助改進它。似乎你每增加一批新單詞都會增加每個價值,那麼是嗎?所以如果你從一個單詞開始說'嗨',然後再添加一個單詞'bye',你的'$ totals'數組就是'['hi'=> 2,'bye'=> 1]';這個想法是什麼? – quickshiftin

2

結合的Mark Bakerquickshiftin的建議,下面的代碼應該是相當快一點,如果輸入的單詞列表包含了許多重複的話:

$counts = array_count_values($words); 
foreach($counts as $word => $count) { 
    $totals[$word] += $count; 
} 

這就是說,在任何情況下,PHP可能不是這種海量數據處理的最佳工具。但是,如果不知道更多關於爲什麼您想要這樣做,很難建議具體的替代方案。

+0

花了我一秒,看看你在那裏做什麼,但是,看起來應該會更快,如果'$ words'數組是非唯一值的列表。從我這裏上傳:) – quickshiftin

+0

你根本不需要循環:'$ totals = array_count_values($ words);'應該是你需要的全部 –

+1

@MarkBaker:OP說他們希望能夠重複地調用這段代碼,用不同的'$ words',並且將字數統計的總和累加到'$ totals'中。您的版本會擦掉早已在'$ totals'中的任何計數。 –

相關問題