算法之海量数据处理

匿名 (未验证) 提交于 2019-12-02 23:43:01

1.散列分治或MapReduce

这种题目很多,大多都相似一通,针对数据特别多的情况下,一般可以选择MapReduce或者散列分治这两种方式其实思想很相似的只有些许不同;针对数据量不大的情况下可是直接加载进内存来的可以使用Trie树,红黑树这一套,hash表都可以使用。

寻找共同的URL

给定两个a和b文件,各存放50亿个URL,每个URL占64字节,内存限制4GB,请找出a和b文件中共同的URL。

一个文件的内存:5 000 000 000 * 64 = 320GB,每个文件可以分为100个小文件,每个文件大约是3.2GB。

思路一:散列分治,先把a通过hash函数分成100个小文件,在对每个小文件进行词频统计可以使用hash表,Trie树,红黑树这些,再把b也进行统计,在对a和b一起进行词频统计,如果有重复就聚在一块用标识符进行标记即可。

思路二:MapReduce,先对a进行MapReduce在对b进行MapReduce,然后再对a和b统计出来的结果在进行MapReduce即可。

思路三:Bloomfilter过滤器,把4GB建立一个位数组,然后把a文件映射上去,在从b文件里面查重。

ps:MapReduce先把文件直接分成M个块这样就生成了M个Map任务,Map进行URL的映射变为字典,在通过HashShuffe对每个Map任务进行分区,然后在merge(还可以排序是可选操作),其实就是分为R个文件存入磁盘中在产生R个Reduce任务,Reduce对词典进行统计然后在存入磁盘中。

 1000万个字符串去重(假设每个字符串64字节)

10 000 000 * 64 = 0.64GB,数据不多可以考虑直接加载进内存,使用Trie树,hash表,红黑树这些都可以去重。

ps:Trie树,利用了字符串的最大前缀信息的一种树结构,非常适合短文本,重复大的字符串查询场景。

 2.外排序

外排序,一般是在内存空间不足的情况下进行的,使用多路归并的思路,就是先把文件分成小文件使用内存排序,然后在将这些有序的小文件进行归并排序。

ps:虽然理论的时间复杂为O(NlogN)但是涉及了大量的IO操作,所以效率低下。

给n个整数排序,没有重复,值都小于等于一千万,内存使用1MB。

思路一:使用位图法,申请一千万个比特数组,空间占用为1.2MB,所以可以分割为两块,比如1-五百万和其他部分,然后在内部排序即可,在进行合并成一个。效率比较高因为IO操作少。

ps:这种区域划分类似于鸽巢原理,根据大小进行分块的思路。

ps:位图法很厉害,很简单,经常用于去重的场景,但是可以扩展为布隆过滤器,使用了K个hash函数,映射出来的k个点代表K个位图,只要数组对应位置上全为1那么这个数有可能出现也有可能不出现(这种情况是由于hash 冲突造成的),但是如果有一个位置不为1那他一定没出现过。

ps:布隆过滤器感觉就是位图和hash表的结合体。

思路二:使用外排序,直接多路归并排序即可,但是IO太多了,效率比较低下。

3.倒排索引

通过词来索引到文档的id号称为倒排索引,找到对应文档的id号。

ps:一般应用于文档检索系统,搜索引擎这种。

4.比较文档的相似度

两篇文档的相似度计算

解法一:可以通过分词得到特征向量,然后可以计算他们之间的欧氏距离,余弦距离,汉明距离,以此来判断相似度大小;

解法二:另一种思路是计算两个文档的散列值然后再进行比较,但是使用传统的哈希算法有个问题,只要字符串有一个微小的差别那么得到结果的差异度就会很大,所以我们必须找一个有相似的的哈希算法可以针对相似的样本可以返回很相似的结果。就此simhash局部敏感散列函数就此出现了。

ps:simhash会得到一个长度为32或64位的二进制由01组成的字符串作为标签,来计算两个标签的汉明距离(也是一种特殊的编辑距离)即可。

ps:simhash的计算一般分为:分词生成加权特征向量,对每个特征向量进行散列加权,在把特征向量进行合并,然后进行降维得到该文档的simhash指纹(合并后值大于零置为1,其他置为0)。

海量网页的去重(simhash的应用)

就是利用了鸽巢原理和倒排索引,(先粗分然后在细分)先进行相似度进行筛选然后在进行细分的思路。详见如下:

首先计算出64位的simhash值,一般认为汉明距离为3那么相似度就比较高了,然后把64位字符串分为四份每份16位,如果相似度很高那么这四份中必有一份和另一个值相同,所以他就对这四个分区建立了倒排索引,key是16位的分区串,value是对应剩余的48位串,例如:要判断某个文档是否出现过只要计算出文档的simhash进行分区然后在数据库里查看是否有值,如果为空那么就没有相似的出现,如果不为空就有相似的出现,于是就可以判断文档是否相同了。

截一段图:

ps:海量网页去重可以类比海量图片甚至是视频(网盘的秒传现象)的去重,其实道理都是一样。

5.一致性hash原理

申请一个很大的数组比如1到2的32次方,然后把用户请求均匀的利用hash函数散列到数组上,再把服务器散列到数组上,每次用户请求时,会寻找离他最近的一台机器,来实现负载均衡。
--------------------- 
作者:下一秒,待续 
来源:CSDN 
原文:https://blog.csdn.net/taka_is_beauty/article/details/90664290 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载请标明出处:算法之海量数据处理
文章来源: https://blog.csdn.net/gb4215287/article/details/91996529
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!