2015-11-15 36 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'中的任何计数。 –

相关问题