一台单机上的一个大文件存了100亿个关键词,统计出现频率最高的top10,如何做?

限制条件

  1. 一台单机
  2. 假定每个关键词占用64个字节
  3. 内存只有2G

怎么统计出现频率最高的top10?

要点

  • MapReduce算法
  • 哈希分桶
  • 小根堆

思路

  1. 文件大小估算:100亿*64/1024/1024/1024 = 596G,可以按行切分成1000个小文件,每个文件大约 600MB;
  2. 哈希分桶:处理每个小文件,按照hash(关键词) % n,重新写入到n个文件中,相同的关键词hash相同,会写入到同一个文件内,n按情况设置即可,比如设为500或1000,这一步其实相当于map过程;
  3. 对n个文件逐个处理,统计每个文件的top10,可以结合哈希表和小根堆实现,具体:遍历每个文件的关键词,统计出现次数,用散列表记录,然后构建一个大小为10的小根堆,遍历散列表,依次和堆顶的关键词对比,如果出现次数比堆顶的多,就删除堆顶的关键词,将该词加入到堆中;
  4. 把n个文件的top10放到一起,再选取出现次数最多的top10,这个就是100亿个关键词中出现次数最多的关键词了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP_wendi

谢谢您的支持。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值