`
eriol
  • 浏览: 400545 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

海量数据面试题

阅读更多

1. 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

 

两个50亿个url的文件,大概有50 0000 0000 * 64 B = 640G的大小,肯定不能全部读入内存,可以分组解决。准备1030个桶,读取两个文件的url,对每个url,通过hash(url)%1031, 把url映射到其中一个桶,然后把每个桶的url都写入一个文件,得到1030个文件,每个文件大约640M大,可以断定,相同的url只可能出现在一个文件中。所以接下来只需依次把1030个文件读入内存,再次通过hash表找出相同的url,当然这次的hash函数不要跟上次用一样的,不然每个url都会出现冲突。最后汇总到一个文件,即得到了结果。算法中之所以取1031的模,是因为1031是素数,且接近1024。

 

 

2. 有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序?

 

总共要处理10G的数据,想办法分割成512份,每份大小为20M。

准备520个桶,读取10个文件的query,对每一个query,通过hash(query)%521,把query映射到其中一个桶,然后把每个桶的query写入一个文件,得到520个文件,每个文件大约20M,可以断定,相同的query只可能出现在一个文件中。所以接下来只需把520个文件依次读入内存,再次使用hash表,统计每个文件内每个url的频度。根据频度,从大到小,写入文件。这样就得到另外520个排好序且不重复的url文件。最后对520个文件使用归并排序,将结果写入文件。

难点1:对于一个由url和频度组成的hash表如何根据频度排序,然后把排序结果写入文件。

难点2:对于520个由url和频度组成的文件,如何使用归并排序。

 

 

3. 海量日志数据,提取出某日访问次数最多的那个IP。

 

IP跟字符串不一样,要充分利用IP的特点,把海量日志分组处理。IP是一个32bit的整数。我们把最高位的10个比特作为组号,将海量日志分成2^10 = 1024个组,存储到1024个小文件中,每个文件最多2^22个不同的IP地址,假设一条日志100个字节,那么每组文件大约2^22*100B = 400M。 然后使用hash表,统计每个小文件出现次数最多的IP,最后从1024个文件中选一个出现次数最多的IP。

 

 

4. 搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前10条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G。请描述思想,写出算法,空间和时间复杂度。

 

要处理的数据有300 0000 * 255B = 765M, 可以全部读入内存,用hash表统计每个字符串的频率,然后用size为10的最小堆来得到最热门的前10条。具体做法为,遍历所有字符串,如果它的频率比最小堆堆顶的元素大,则取而代之,最后最小堆剩下的字符串就是最热门的前10条。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics