限制条件
- 一台单机
- 假定每个关键词占用64个字节
- 内存只有2G
怎么统计出现频率最高的top10?
要点
- MapReduce算法
- 哈希分桶
- 小根堆
思路
- 文件大小估算:100亿*64/1024/1024/1024 = 596G,可以按行切分成1000个小文件,每个文件大约 600MB;
- 哈希分桶:处理每个小文件,按照hash(关键词) % n,重新写入到n个文件中,相同的关键词hash相同,会写入到同一个文件内,n按情况设置即可,比如设为500或1000,这一步其实相当于map过程;
- 对n个文件逐个处理,统计每个文件的top10,可以结合哈希表和小根堆实现,具体:遍历每个文件的关键词,统计出现次数,用散列表记录,然后构建一个大小为10的小根堆,遍历散列表,依次和堆顶的关键词对比,如果出现次数比堆顶的多,就删除堆顶的关键词,将该词加入到堆中;
- 把n个文件的top10放到一起,再选取出现次数最多的top10,这个就是100亿个关键词中出现次数最多的关键词了。