海量数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海量数据相关的知识,希望对你有一定的参考价值。
模式一:分而治之/Hash映射 + Hash统计 + 堆/快排/归并
海量的数据,找出出现频率最高的唯一一个
分而治之/Hash映射 + Hash统计+堆/快排
1. 海量日志数据,提取出某日访问百度次数最多的那个IP。
(1)hash(IP)%1000分到1000个文件中
(2)hashMap统计每个文件中IP出现的频率
(3)取出1000个文件中IP出现频率最高的IP,进行排序
海量的数据,找出出现频率最高的多个
分而治之/Hash映射 + Hash统计 +归并排序
2. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
(1)hash(word)%5000分到5000个文件中
(2)hashMAP统计每个文件中单词出现的频率,使用堆取出频率最高的前100个
(3)把每个文件中的频率最高的100个单词放到文件中,又得到了5000个文件,然后进行归并排序
归并排序的过程:
1TB数据使用32GB内存如何排序
①、把磁盘上的1TB数据分割为40块(chunks),每份25GB。(注意,要留一些系统空间!)
②、顺序将每份25GB数据读入内存,使用quick sort算法排序。
③、把排序好的数据(也是25GB)存放回磁盘。
④、循环40次,现在,所有的40个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!)
⑤、从40个块中分别读取25G/40=0.625G入内存(40 input buffers)。
⑥、执行40路合并,并将合并结果临时存储于2GB 基于内存的输出缓冲区中。当缓冲区写满2GB时,写入硬盘上最终文件,并清空输出缓冲区;当40个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个0.625GB,直到全部处理完成。
海量的数据,找出最大的K个
建堆
3. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
堆排序:在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。
两个文件中相同的数据
分而治之/Hash映射 + Hashset
4. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
- hash映射:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件中(记为a0,a1,a2,...,a999),这样每个小文件的大约为300M。遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为b0,b1,b2,...,b999)。这样处理后,所有可能相同的url都在对应的小文件(a0VSb0,a1VSb1,a2VSb2,...a999VSb999)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
- hash统计:求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
出现频率最高的单词
Trie树
(1)根节点为空
(2)根节点到某一节点路径上的字符之和就是该节点中的字符串
(3)我们建树的时候,真正存在的字符串是要标红的
1.插入过程
对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完,将最后的节点标记为红色,表示该单词已插入trie树。
2. 查找过程
其方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。其他操作类似处理.
即从根开始按照单词的字母顺序向下遍历trie树,一旦发现某个节点标记不存在或者单词遍历完成而最后的节点未标记为红色,则表示该单词不存在,若最后的节点标记为红色,表示该单词存在。如下图中:trie树中存在的就是abc、d、da、dda四个单词。在实际的问题中可以将标记颜色的标志位改为数量count等其他符合题目要求的变量。
5. 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(nle)(le表示单词的平均长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(nlg10)。所以总的时间复杂度,是O(nle)与O(nlg10)中较大的那一个。
模式二:Bitmap
6. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^31 * 2 bit = 1GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
以上是关于海量数据的主要内容,如果未能解决你的问题,请参考以下文章