我一語計數器功能類的一部分,我想,以適應運行非常大的數據集如何使我的短語計數器運行速度更快
<?php
private static function do_phrase_count($words, $multidim, $count, $pcount){
if($multidim === false){
$words = array($words);
}
$tally = array();
$arraycount = 0;
foreach($words as $wordgroup){
$max = count($wordgrounp) - $pcount;
for($x = 0; $x < $max; $x++){
$cutoff = $x + $pcount;
$spacekey = false;
$phrase = '';
$z = 0;
for($y = $x; $y < $cutoff; $y++){
if($spacekey) $phrase .= ' ';
else $spacekey = true;
$phrase .= $wordgroup[$y + $z];
$z++;
}
if(isset($tally[$phrase])){
$tally[$phrase]++;
$arraycount++;
}
else $tally[$phrase] = 1;
if($arraycount > 99999){
arsort($tally);
$tally = array_slice($tally, 0, 50000);
$arraycount = 49999;
}
}
}
arsort($tally);
$out = array_slice($tally, 0, $count);
return $out;
}
- $的話是話的數組檢查
- $ multidim是布爾表示如果該陣列被級聯或平坦
- $計數是要被返回的元素數
- $ pcount是詞語的短語中的數
隨着每次迭代,array_key_exists變慢,所以在某個點我需要減小計數數組的大小。
我正在考慮使用限制(100K)來阻止腳本添加新數組元素到$ tally,或者甚至使用總詞的百分比,但是當我停止向數組添加新元素後,我失去了跟蹤可能會出現的趨勢。 (如果我正在分析整年的數據,到6月份的時候,我將無法將「夏令時」看作趨勢)。
任何人都有一個解決方案,以便如何限制我的理貨數組,以保持腳本不變而不會失去追蹤趨勢的能力?
更新:我根據您的建議更改了腳本。感謝您的幫助。我也想出了一個解決方案來減少陣列的大小。
什麼是您的內存使用情況的樣子,當事情變得顯著慢?你是否遇到交換空間? – sarnold 2012-02-01 03:00:13
我將不得不重新運行,並讓你知道..它似乎在200megs左右緩慢。 300megs需要比200megs數據長5倍。我也必須在64位系統上試試這個..現在在32上運行它 – 2012-02-01 03:05:35