海量数据处理

1.给一个超过100G大小的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址。
显然可以明显看出这100G的日志文件是不能直接加载到内存中去处理的,所以首先可以想到的是对大文件需要进行划分,前提时需要保证同一个反复出现的ip会出现在同一文件当中。
假定我们将这个大文件分成1024,这样每个文件的平均大小在100M左右,利用hash算法对ip地址进行映射,得到的值模一个1024,将同一个ip映射到同一个文件。
处理文件时以它们的hash(ip)作为key值,出现的次数作value构造一个map,利用排序算法,对它们出现的次数进行排序。
这样我们可以得到每个小文件出现次数最多的ip,最后显然对这些小文件筛选出的次数最多的ip进行排序,得到出现次数最多的ip地址。

2.与上题目条件想同,如何找到topk的ip
本题目是寻找topk的ip,显然需要利用堆去处理,找出现次数最多topkip,可以构建一个个数为k的小堆,然后让分成的小文件依次进入小堆,比堆顶大就进堆。这样最后堆中留下的ip即为出现次数的topk的ip地址。

3,给定两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集,分别给出近似算法和精确算法。
假定每个query平均有50个字节,那么100亿个query就会大约占用500G的内存。
精确算法:
处理庞大的数据显然需要利用hash的思想,所以可以将每份文件分成1024份,利用hash算法可以将相同的queery映射到相同编号的文件当中,然后用第二份文件中的query去遍历第一份文件,去查看是否存在。
近似算法:(在误差允许的范围内,可以利用布隆)
1G内存可以表示的bite位有1024*1024*1024*32(大约80亿左右),表示100亿个query左或不在是不够的,那么可以把100亿切分成二等分,构造两个布隆,将一个query划分成为5个bit位去表示在与不在,然后再让第二份文件的query利用同样的5个hash算法确定5个bit,去看它是否在两个布隆当中。
备注:布隆的不在是准确的,但在是有误差的。

4.给上千个文件,每个文件大小为1K~100M。给n个词,设计算法对每个词找到所有包含它们的文件。你只有100K内存。
一般情况下我们会利用map将每个文件出现的词用map组织起来,然后用需要查找的词依次去遍历这些文件,看是否出现,但这道题显然这种方式是不可行的,内存是明显不够的,我们可以借鉴倒排索引的思路去解决这个问题。我们可以将需要查找的词作为key值,以一个指向文件的指针链表作为value的map实现,依次从文件拿出词去遍历这个图,如果存在那么将这个文件的指针挂在链表上。

5.有一个词典包含N个英文单词,现在任意给一个字符串,设计算法找出所有包含这个字符串的英文单词。
找出包含任给子符串的英文单词,如果一一去遍历每个英文单词,那么效率显然是极其低效的,所以需要将这个英文单词组织起来,然后再去遍历,字典树可以很好的将这些单词组织起来,然后依次遍历,这是一种典型的用空间换取时间的做法,与前面的节省空间显然是不同的。
备注:如果有不熟悉字典树的读者呢可以参照下面的博客:http://blog.csdn.net/jiutianhe/article/details/8076835

猜你喜欢

转载自blog.csdn.net/nuyexiaoxiang/article/details/78738414