本文整理和大家分享一些 SQL 数据库对于海量数据面试题及答案给大家,很不错哦,喜欢
请收藏一下。
1. 给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64 字节,内存限制是 4G,让你找
出 a、b 文件共同的 url?
方案 1:可以估计每个文件安的大小为 50G×64=320G,远远大于内存限制的 4G。所以不可
能将其完全加载到内存中处理。考虑采取分而治之的方法。
s 遍历文件 a,对每个 url 求取,然后根据所取得的值将 url 分别存储到 1000 个小文件(记
为)中。这样每个小文件的大约为 300M。
s 遍历文件 b,采取和 a 相同的方式将 url 分别存储到 1000 各小文件(记为)。这样处理后,
所有可能相同的 url 都在对应的小文件()中,不对应的小文件不可能有相同的 url。然后
我们只要求出 1000 对小文件中相同的 url 即可。
s 求每对小文件中相同的 url 时,可以把其中一个小文件的 url 存储到 hash_set 中。然后遍历
另一个小文件的每个 url,看其是否在刚才构建的 hash_set 中,如果是,那么就是共同的
url,存到文件里面就可以了。
方案 2:如果允许有一定的错误率,可以使用 Bloom filter,4G 内存大概可以表示 340 亿
bit。将其中一个文件中的 url 使用 Bloom filter 映射为这 340 亿 bit,然后挨个读取另外一个
文件的 url,检查是否与 Bloom filter,如果是,那么该 url 应该是共同的 url(注意会有一定
的错误率)。
2. 有 10 个文件,每个文件 1G,每个文件的每一行存放的都是用户的 query,每个文件的
query 都可能重复。要求你按照 query 的频度排序。
方案 1:
s 顺序读取 10 个文件,按照 hash(query)%10 的结果将 query 写入到另外 10 个文件(记为)
中。这样新生成的文件每个的大小大约也 1G(假设 hash 函数是随机的)。
s 找一台内存在 2G 左右的机器,依次对用 hash_map(query, query_count)来统计每个 query
出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的 query 和对应的
query_cout 输出到文件中。这样得到了 10 个排好序的文件(记为)。
s 对这 10 个文件进行归并排序(内排序与外排序相结合)。
方案 2:
一般 query 的总量是有限的,只是重复的次数比较多而已,可能对于所有的 query,一次性
就可以加入到内存了。这样,我们就可以采用 trie 树/hash_map 等直接来统计每个 query 出
现的次数,然后按出现次数做快速/堆/归并排序就可以了。
评论1
最新资源