所谓的是否能一次读入内存,实际上应该指去除重复后的数据量 。如果去重后数据可以放入内存,我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可 。当然在更新每条数据的出现次数的时候,我们可以利用一个堆来维护出现次数最多的前N个数据,当然这样导致维护次数增加,不如完全统计后在求前N大效率高 。
如果数据无法放入内存 。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形,可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法 。
当然还有更好的方法,就是可以采用分布式计算,基本上就是map-reduce过程,首先可以根据数据值或者把数据hash(md5)后的值 , 将数据按照范围划分到不同的机子,最好可以让数据划分后可以一次读入内存 , 这样不同的机子负责处理各种的数值范围,实际上就是map 。得到结果后,各个机子只需拿出各自的出现次数最多的前N个数据,然后汇总 , 选出所有的数据中出现次数最多的前N个数据,这实际上就是reduce过程 。
实际上可能想直接将数据均分到不同的机子上进行处理 , 这样是无法得到正确的解的 。因为一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上,同时还可能存在具有相同数目的数据 。比如我们要找出现次数最多的前100个,我们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个 , 归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子 , 这样在每台上只有1千个,假设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集 。因此不能将数据随便均分到不同机子上 , 而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围 。
而外排序的方法会消耗大量的IO,效率不会很高 。而上面的分布式方法 , 也可以用于单机版本 , 也就是将总的数据根据值的范围,划分成多个不同的子文件 , 然后逐个处理 。处理完毕之后再对这些单词的及其出现频率进行一个归并 。实际上就可以利用一个外排序的归并过程 。
另外还可以考虑近似计算 , 也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存 。
关于php如何处理大数据项目和php如何处理大数据项目结果的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- 如何修改戴尔服务器的IP地址? 戴尔服务器ip地址怎么改
- 纯phpmysql
- 查找php.ini phpredis查找
- 优惠券功能的业务流程设计图谱 优惠券redis处理
- redis不适用场景 redis处理场景识别
- 如何正确接入高防服务器? 高防服务器怎么接
- 如何处理云服务器游戏黑屏问题? 云服务器游戏黑屏怎么解决
- redis分布式锁死锁处理方案 redis宕机分布式锁
- 如何查看戴尔服务器的IP地址? 戴尔服务器ip地址怎么看
