这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。海量数据

101 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。

大体上的思想是分治,先把大文件hash分割成小文件,然后对各个小文件再分别处理,最后再统计处理。

一、海量日志中找频率最高的IP地址

IP地址的位数是有限的,可以通过直接hash函数将这些ip分散到1000个小文件中(hash函数直接用ip地址模1000即可),然后统计每个小文件的频率最高的ip,这样可以从1000个小文件中得到1000个频率较高的的IP地址,最后在1000个IP中找到出现次数最高的IP。

二、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,返回频数最高的100个词。

将这个文件hash到5000个小文件中,则每个文件的平均大小为200k左右,当然如果不均匀的话,可能某个小文件会大一些,这样就将这个文件再hash一下。然后统计每个文件中的词和词频,再利用小顶堆即可。

三、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求按照query的频度排序。

顺序读取这10个文件,通过hash%10将这些文件写入到另外10个文件。然后对每个文件中的query根据频次进行内部排序即可,排序后进行多路归并排序。

四、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url

使用hash%1000,将a文件中的所有url映射到1000个小文件中,同样的方式将b文件的url 映射到1000个小文件中。这样index不同的小文件中url一定是不相同的,只要比较index相同的文件中相同的url即可。

五、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中。

使用bitmap,2^32个bit,存在为1,不存在为0

建立二叉树,无符号整数有32位,则建立一个深度为32的树,左子树为0,右子树为1,这样新来一个target直接查即可。

六、10亿个数找中位数

分桶,大概计算出中位数在那个桶里。