海量数据面试题整理(一)

1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
方案1:可以估计每个文件的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。
第一步:s 遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999)中。这样每个小文件的大约为300M。
第二步:s遍历文件b,采取和a相同的方式将url分别存储在1000个小文件(记为b0,b1,…,b999)。
第三步:求每对小文件中相同url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同url,存到文件里面就可以了。
大概有1000*1000对,就是1百万对。
方案2:果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
布隆过滤器是什么参考另外一篇博客:
什么是布隆过滤器

2、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
方案一:
第一步:顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件中。这样新生成的文件每个的大小大约也1G。
第二步:找一台内存在2G左右的及其,依次对a0,a1,…,a9用hash_map(query,query_count)来统计每个query出现的次数。利用快速排序按照出现次数进行排序。将排序好的query和对应的query_count输出到文件中。这样得到了10个排好序的文件(记为b0,b1,…,b10)。
第三步:对b0,b1,…,b10这10个文件进行归并排序。

方案二:一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

你可能感兴趣的:(面试题,海量数据)