参考https://blog.csdn.net/v_july_v/article/details/7382693
一、分而治之/hash映射
1、针对数据太大,内存受限,只能是:把大文件化成(取模映射)的小文件,即16字方针:大而化小,各个击破,缩小规模,逐个解决
2、hash_map词频统计:当大文件转出成了小文件,那么我们便可以采用常规的hash_map(ip,value)来进行词频统计。
3、堆/快速排序:统计完了之后,便进行排序,得到出现次数最多的值
二、有一百亿条数据和8G内存,统计top1000的ip
1、估测一下数据量
一个ip最多是 xxx.xxx.xxx.xxx共15个char(1char=1byte)
1亿*100=1500000000byte*100=1.5G*100=150G,可分成1000个文件,每个文件150M
2、将ip转换成long,然后用100取余,分到100个文件中
3、一个文件一个文件的处理,进行词频统计
读一个文件,将数据存成map(ip,sum)
进行排序,求一个文件的top100,写到文件中
4、处理所有文件,得到top100
三、有a、b两个文件,各放50亿个url,每个url64字节,内存限制是4G,让你找出a,b两个文件共同的url
1、估测一下数据量
50亿*64KB=50 00000000 * 64KB=320G,即每个文件520G,分成1000个小文件的话,每个小文件320M
2、分而治之/hash映射
遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,a2,...,a999)中。这样每个小文件的大小为320M。遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为b0,b1,b2,...,b999)。这样处理后,所有可能相同的url都在对应的小文件(a0 vs b0,a1 vs b1,a2 vs b2,...,a999 vs b999)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
3、hash_set统计
求每对个小文件中相同的URL时,可以把其中一个小文件的URL存储到hash_set中,然后遍历另一个小文件的每个URL,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。