典型的TOP N问题,思路就是分而治之,将文件split多个块,每个块取TOP N
海量数据面前要多采用分治算法,化整为零 。
如果数据能够在内存中放下,比如如果海量数据是ip地址,最多有4G个ip地址,每个ip地址占4个字节 需要内存16G,如果内存在几十G,则完全可以全部装入内存,直接读取大文件,然后创建一个hash表,统计次数,最后再用堆统计最大的n个。
如果不能在内存放下,比如海量数据是字符串,不同的字符串个数无限,内存中可能存不下,那么需要先将海量数据进行分堆,按照hash值进行分堆,分成适宜在内存中操作的小文件,比如内存1G,字符串有20G,那么就分成20个以上的小文件。
(1)1G文件远远大于1M内存,分治法,先hash映射把大文件分成很多个小文件,具体操作如下:读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为f0,f1,...,f4999)中,这样每个文件大概是200k左右(每个相同的词一定被映射到了同一文件中)
(2)对于每个文件fi,都用hash_map做词和出现频率的统计,取出频率大的前100个词(怎么取?topK问题,建立一个100个节点的最小堆),把这100个词和出现频率再单独存入一个文件
(3)根据上述处理,我们又得到了5000个文件,归并文件取出top100(Top K 问题,比较最大的前100个频数)
原文:
https://blog.csdn.net/Fly_as_tadpole/article/details/88375993
https://blog.csdn.net/longzuo/article/details/46409729