统计外站的搜索关键词的词频
通过外站的链接主要是百度,谷歌,soso等,每天都有通过记录在日志文件中,每天会运行程序进行统计。
每天产生有10多个文件,每个文件1G左右, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要按照解析query中的关键词,并对统计其频度,取出搜索次数最多的前1000个关键词。
第一次直接遍历所有文件并按照Map<String,Integer>方式来统计,统计差不多共有四千万条记录,词也有一百万多个,最后排序实现。方法简单,但也有很大的缺点,占用的内存太大,可能会将服务器弄垮掉。
先不统计,利用外存处理,将分析出来的每一个关键词,取出第一个字符的哈希值%500,分别放进500个临时文件中,然后才对每个文件进行统计。
由于只取前1000个关键词,所以每统计完一个文件后,采用堆排序,将前1000名的关键词保存在一个堆里,这样内存中只维护一份堆,可以减少许多内存的消耗,只占用到之前的五分之一以下。速度较之前也提高不少。
主要代码: