美文网首页
海量数据问题

海量数据问题

作者: Lee_Lemon | 来源:发表于2019-03-23 13:35 被阅读0次

摘录于:
http://www.cnblogs.com/v-July-v/archive/2012/03/22/2413055.html
作者:July
海量数据处理的问题来源于实际生活。也是面试中最长被问到的问题。
解决海量数据处理的方法主要有以下六种:
1、分治思想/Hash映射 + Hash统计 + 堆/快速/归并排序
2、双层桶划分
3、Bloom Filter/BitMap
4、Trie树、数据库、倒排索引
5、外排序
6、分布式处理(Hadoop/MapReduce)
一:分治+Hash映射+Hash统计+堆/快速/归并排序
例题1:海量日志文件,提取访问百度次数最多的那个IP
答:1、针对海量日志文件(内存不可能一次性读完),采用分而治之的思想,将大文件切割成小文件(大而化小,缩小问题规模)
2、采用常规的HashMap来进行频率统计。
3、堆/快速排序来获得次数最多的IP。
例题2:搜索引擎通过用户日志将用户每次检索的检索串记录下来,每个检索串长度为1-255Byte,假设现在有1000W个记录(查询串的重合率很高,去重后后大概只有300W条记录),请统计最热门的10个查询串,要求使用的内存不超过1G。
答:1、内存能否一次容纳300W条记录。由(300W < 2^10 * 2^ 10 * 3 ,既有300W * 256Byte < 1G)可知内存能够一次性装下所有记录。因此不需要选择分而治之来划分成小文件
2、hash统计:依然采用hashmap<queryString,count>用来做hash统计,用hashmap构建一个table,如果queryString在table中则count++,没有则加入table并将count设为1.
3、堆排序:通过堆排序来找出Top10的查询串。(堆排序的时间复杂度是logn级别的)
此题还可以用Trie树来解
例题3:有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
答:1、由于有内存限制所以需要采用分治的思想来把文件划分成小于1M内存空间的文件块。(具体操作:顺序读文件。将每个词x采用取Hash(x)% 5000 这样就划分成5000个文件,假如有超过1M空间的文件,继续划分)
2、hash统计:采用Trie树或者HashMap<String,int>的数据结构来统计每个词的频率
3.堆排序或者归并排序,对于每个文件取频率前100的词,将词以及对应的频率一起存入文件中,然后进行堆排序或者归并排序。
例题4:有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
答:hash映射:1/顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。
2、hash统计:找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。注:hash_map(query,query_count)是用来统计每个query的出现次数,不是存储他们的值,出现一次,则count+1。
3、堆/快速/归并排序:利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。对这10个文件进行归并排序(内排序与外排序相结合)。
除此之外,此题还有以下两个方法:
方案2:一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
方案3:与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
例题5:一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(nle)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(nlg10)。所以总的时间复杂度,是O(nle)与O(nlg10)中较大的哪一个。(考虑时间复杂度的题最难,要求对于算法的时间复杂度要熟悉)
二:双层桶划分
双层桶划分的实质还是分而治之的思想,重点在分的技巧上面。
双层桶主要在解决求第K大,中位数或者不重复的数字上有作用。
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子.
例题1:.2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
  有点像鸽巢原理,证书我们可以将这2^32 个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。
例题2:5亿个int找它们的中位数。
  这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。
三、Bloom filter/Bitmap
BloomFilter: Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想。
但Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。
Bitmap:位图
例题1:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
方案2:也可采用与第1题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。
例题2:腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
方案1:申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。
四、Trie树/数据库/倒排索引
Trie树:
适用范围:数据量大,重复多,但是数据种类小可以放入内存
基本原理及要点:实现方式,节点孩子的表示方式
扩展:压缩实现。
数据库:
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
倒排索引(Inverted index)
适用范围:搜索引擎,关键字查询
基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
五、外排序
适用范围:大数据的排序,去重
基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树
六:分布式处理MapReduce
适用范围:大数据的排序,去重
基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树

相关文章

  • 海量数据问题

    摘录于:http://www.cnblogs.com/v-July-v/archive/2012/03/22/24...

  • 大数据简介

    一、大数据面临的挑战: 海量数据如何的问题 海量数据如何的问题 二、大数据的特点(5V特征) Volume(数据量...

  • 大数据技术包含了什么?什么是Hadoop?

    ​ 大数据顾名思义就是海量数据(PB级别以上)。当然咯,其中包括海量数据处理和海量数据存储。那么问题就来了?我们都...

  • 大数据入门

    大数据主要解决海量数据(TB、PB或EB)的存储和海量数据的分析计算问题 大数据的特点: Volume(大量) V...

  • hadoop框架学习笔记一 2020-04-01

    1.1大数据概论 主要解决海量数据存储和海量数据的分析计算问题 1.2大数据的特点 * volume(大量) *v...

  • 【直通BAT】海量数据面试总结

    目录 海量数据计算总结 海量数据去重总结 1. 计算容量 在解决问题之前,要先计算一下海量数据需要占多大的容量。常...

  • Hadoop系列-Hadoop简介与运行环境搭建

    hadoop简介 hadoop主要是解决海量数据的存储和海量数据的分析计算问题,狭义上来说,hadoop最擅长做海...

  • 面试必备之海量数据处理

    关于海量数据处理问题,通过最近的面试可以看出这是一个经常会问的问题。本篇文章基于实际的面试问题,总结关于海量数据处...

  • 面试必备总结 - 海量数据处理

    关于海量数据处理问题,通过最近的面试可以看出这是一个经常会问的问题。本篇文章基于实际的面试问题,总结关于海量数据处...

  • 产品经理如何进行数据分析

    移动互联网,物联网产生了海量的数据,大数据计算技术完美的解决了海量数据收集、计算、存储、分析的问题。催生了大数据时...

网友评论

      本文标题:海量数据问题

      本文链接:https://www.haomeiwen.com/subject/usgdvqtx.html