快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

太阳娱乐网址古天乐代言:php 大数据量及海量数据处理算法总结



下面的措施是我对海量数据的处置惩罚措施进行了一个一样平常性的总结,当然这些措施可能并不能完全覆盖所有的问题,然则这样的一些措施也基础可以处置惩罚绝大年夜多半碰到的问题。下面的一些问题基础直接滥觞于公司的口试笔试题目,措施不必然最优,假如你有更好的处置惩罚措施,迎接与我评论争论。

1.Bloom filter

适用范围:可以用来实现数据字典,进行数据的判重,或者聚拢求交集

基滥觞基本理及要点:

对付道理来说很简单,位数组+k个自力hash函数。将hash函数对应的值的位数组置1,查找时假如发明所有hash函数对应位都是1阐明存在,很显着这个历程并不包管查找的结果是100%精确的。同时也不支持删除一个已经插入的关键字,由于该关键字对应的位会牵动到其他的关键字。以是一个简单的改进便是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。

还有一个对照紧张的问题,若何根据输入元素个数n,确定位数组m的大年夜小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时差错率最小。在差错率不大年夜于E的环境下,m至少要即是n*lg(1/E)才能表示随意率性n个元素的聚拢。但m还应该更大年夜些,由于还要包管bit数组里至少一半为 0,则m 应该>=nlg(1/E)*lge 大年夜概便是nlg(1/E)1.44倍(lg表示以2为底的对数)。

举个例子我们假设差错率为0.01,则此时m应大年夜概是n的13倍。这样k大年夜概是8个。

留意这里m与n的单位不合,m是bit为单位,而n则因此元素个数为单位(准确的说是不合元素的个数)。平日单个元素的长度都是有很多bit的。以是应用bloom filter内存上平日都是节省的。

扩展:

Bloom filter将聚拢中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个聚拢中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与聚拢元素的呈现次数关联。SBF采纳counter中的最小值来近似表示元素的呈现频率。

问题实例:给你A,B两个文件,各寄放50亿条URL,每条URL占用64字节,内存限定是4G,让你找出A,B文件合营的URL。假如是三个甚至n个文件呢?

根据这个问题我们来谋略下内存的占用,4G=2^32大年夜概是40亿*8大年夜概是340亿,n=50亿,假如按掉足率0.01算必要的大年夜概是650亿个 bit。现在可用的是340亿,相差并不多,这样可能会使掉足率上升些。别的假如这些urlip是逐一对应的,就可以转换成ip,则大年夜大年夜简单了。

2.Hashing

适用范围:快速查找,删除的基础数据布局,平日必要总数据量可以放入内存

基滥觞基本理及要点:

hash函数选择,针对字符串,整数,排列,详细响应的hash措施。

碰撞处置惩罚,一种是open hashing,也称为拉链法;另一种便是closed hashing,也称开地址法,opened addressing。 (http://www.my400800.cn)

扩展:

d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分生长度相等的两半,分手叫做T1和T2,给T1和T2分手配备一个哈希函数,h1和h2。在存储一个新的key时,同时用两个哈希函数进行谋略,得出两个地址h1[key]和h2[key]。这时必要反省T1中的h1[key]位置和T2中的h2[key]位置,哪一个位置已经存储的(有碰撞的)key对照多,然后将新key存储在负载少的位置。假如两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

问题实例:

1).海量日志数据,提掏出某日造访百度次数最多的那个IP。

IP的数目照样有限的,最多2^32个,以是可以斟酌应用hash将ip直接存入内存,然落后行统计。

3.bit-map

适用范围:可进行数据的快速查找,判重,删除,一样平常来说数据范围是int的10倍以下

基滥觞基本理及要点:应用bit数组来表示某些元素是否存在,比如8位电话号码

扩展:bloom filter可以看做是对bit-map的扩展

问题实例:

1)已知某个文件内包孕一些电话号码,每个号码为8位数字,统计不合号码的个数。

8位最多99 999 999,大年夜概必要99m个bit,大年夜概10几m字节的内存即可。

2)2.5亿个整数中找出不重复的整数的个数,内存空间不够以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未呈现,1表示呈现一次,2表示呈现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。

4.堆

适用范围:海量数据前n大年夜,并且n对照小,堆可以放入内存

基滥觞基本理及要点:最大年夜堆求前n小,最小堆求前n大年夜。措施,比如求前n小,我们对照当前元素与最大年夜堆里的最大年夜元素,假如它小于最大年夜元素太阳娱乐网址古天乐代言,则应该调换那个最大年夜元素。这样着末获得的n个元素便是最小的n个。得当大年夜数据量,求前n小,n的大年夜小对照小的环境,这样可以扫描一遍即可获得所有的前n元素,效率很高。

扩展:双堆,一个最大年夜堆与一个最小堆结合,可以用来掩护中位数。

问题实例:

1)100w个数中找最大年夜的前100个数。

用一个100个元素大年夜小的最小堆即可。

5.双层桶划分 ----着实本色上便是【分而治之】的思惟,重在“分”的技术上!

适用范围:第k大年夜,中位数,不重复或重复的数字

基滥觞基本理及要点:由于元素范围很大年夜,不能使用直接寻址表,以是经由过程多次划分,慢慢确定范围,然后着末在一个可以吸收的范围内进行。可以经由过程多次缩小,双层只是一个例子。

扩展:

问题实例:

1).2.5亿个整数中找出不重复的整数的个数,内存空间不够以容纳这2.5亿个整数。

有点像鸽巢道理,整数个数为2^32,也便是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不合的区域,然后不合的区域在使用bitmap就可以直接办理了。也便是说只要有足够的磁盘空间,就可以很方便的办理。

2).5亿个int找它们的中位数。

这个例子比上面那个更显着。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大年夜数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,假如不是int是int64,我们可以颠末3次这样的划分即可低落到可以吸收的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大年夜数,在将该区域分成2^20个子区域,然后确定是子区域的第几大年夜数,然后子区域里的数的个数只有2^20,就可以直接使用direct addr table进行统计了。

6.数据库索太阳娱乐网址古天乐代言引

适用范围:大年夜数据量的增编削查

基滥觞基本理及要点:使用数据的设计实现措施,对海量数据的增编削查进行处置惩罚。

扩展:

问题实例:

7.倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基滥觞基本理及要点:为何叫倒排索引?一种索引措施,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例,下面是要被索引的文本:

T0 = "it is what it is"

T1 = "what is it"

T2 = "it is a banana"

我们就能获得下面的反向文件索引:

"a": {2}

"banana": {2}

"is": {0, 1, 2}

"it": {0, 1, 2}

"what": {0, 1}

检索的前提"what", "is" 和 "it" 将对应聚拢的交集。

正向索引开拓出来用来存储每个文档的单词的列表。正向索引的查询每每满意每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档盘踞了中间的位置,每个文档指向了一个它所包孕的索引项的序列。也便是说文档指向了它包孕的那些单词,而反向索引则是单词指向了包孕它的文档,很轻易看到这个反向的关系。

扩展:

问题实例:文档检索系统,查询那些文件包孕了某单词,比如常见的学术论文的关键字搜索。

8.外排序

适用范围:大年夜数据的排序,去重

基滥觞基本理及要点:外排序的归并措施,置换选择 败者树道理,最优归并树

扩展:

问题实例:

1).有一个1G大年夜小的一个文件,里面每一行是一个词,词的大年夜小不跨越16个字节,内存限定大年夜小是1M。返回频数最高的100个词。

这个数据具有很显着的特征,词的大年夜小为16个字节,然则内存只有1m做hash有些不敷,以是可以用来排序。内存可以当输入缓冲区应用。

9.trie树

适用范围:数据量大年夜,重复多太阳娱乐网址古天乐代言,然则数据种类小可以放入内存

基滥觞基本理及要太阳娱乐网址古天乐代言点:实现要领,节点孩子的表示要领

扩展:压缩实现。

问题实例:

1).有10个文件,每个文件1G, 每个文件的每一行都寄放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 。

2).1000万字符串,此中有些是相同的(重复),必要把重复的整个去掉落,保留没有重复的字符串。讨教怎么设计和实现?

3).探求热门查询:查询串的重复度对照高,虽然总数是1切切,但假如撤除重复后,不跨越3百万个,每个不跨越255字节。

10.散播式处置惩罚 mapreduce

适用范围:数据量大年夜,然则数据种类小可以放入内存

基滥觞基本理及要点:将数据交给不合的机械去处置惩罚,数据划分,结果归约。

扩展:

问题实例:

1).The canonical example application of MapReduce is a process to count the appearances of

each different word in a set of documents:

void map(String name, String document):

// name: document name

// document: document contents

for each word w in document:

EmitIntermediate(w, 1);

void reduce(String word, Iterator partialCounts):

// key: a word

// values: a list of aggregated partial counts

int result = 0;

for each v in partialCounts:

result += ParseInt(v);

Emit(result);

Here, each document is split in words, and each word is counted initially with a "1" value by

the Map function, using the word as the result key. The framework puts together all the pairs

with the same key and feeds them to the same call to Reduce, thus this function just needs to

sum all of its input values to find the total appearances of that word.

2).海量数据散播在100台电脑中,想个法子高效统计出这批数据的TOP10。

3).一共有N个机械,每个机械上有N个数。每个机械最多存O(N)个数并对它们操作。若何找到N^2个数的中数(median)?

经典问题阐发

上切切or亿数据(有重复),统计此中呈现次数最多的前N个数据,分两种环境:可一次读入内存,弗成一次读入。

可用思路:trie树+堆,数据库索引,划分子集分手统计,hash,散播式谋略,近似统计,外排序

所谓的是否能一次读入内存,实际上应该指去除重复后的数据量。假如去重后数据可以放入内存,我们可以为数据建立字典,比如经由过程 map,hashmap,trie,然后直接进行统计即可。当然在更新每条数据的呈现次数的时刻,我们可以使用一个堆来掩护呈现次数最多的前N个数据,当然这样导致掩护次数增添,不如完全统计后在求前N大年夜效率高。

假如数据无法放入内存。一方面我们可以斟酌上面的字典措施能否被改进以适应这种情形,可以做的改变便是将字典寄放到硬盘上,而不是内存,这可以参考数据库的存储措施。

当然还有更好的措施,便是可以采纳散播式谋略,基础上便是map-reduce历程,首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不合的机子,最好可以让数据划分后可以一次读入内存,这样不合的机子认真处置惩罚各类的数值范围,实际上便是map。获得结果后,各个机子只需拿出各自的呈现次数最多的前N个数据,然后汇总,选出所有的数据中呈现次数最多的前N个数据,这实际上便是reduce历程。

实际上可能想直接将数据均分到不合的机子长进行处置惩罚,这样是无法获得精确的解的。由于一个数据可能被均分到不合的机子上,而另一个则可能完全凑集到一个机子上,同时还可能存在具有相同数目的数据。比如我们要找呈现次数最多的前100个,我们将1000万的数据散播到10台机械上,找到每台呈现次数最多的前 100个,归并之后这样不能包管找到真正的第100个,由于比如呈现次数最多的第100个可能有1万个,然则它被分到了10台机子,这样在每台上只有1千个,假设这些机子排名在1000个之前的那些都是零丁散播在一台机子上的,比如有1001个,这样原先具有1万个的这个就会被淘汰,纵然我们让每台机子选出呈现次数最多的1000太阳娱乐网址古天乐代言个再归并,仍旧会掉足,由于可能存在大年夜量个数为1001个的发生凑集。是以不能将数据随便均分到不合机子上,而是要根据hash 后的值将它们映射到不合的机子上处置惩罚,让不合的机械处置惩罚一个数值范围。

而外排序的措施会耗损大年夜量的IO,效率不会很高。而上面的散播式措施,也可以用于单机版本,也便是将总的数据根据值的范围,划分成多个不合的子文件,然后逐个处置惩罚。处置惩罚完毕之后再对这些单词的及其呈现频率进行一个归并。实际上就可以使用一个外排序的归并历程。

别的还可以斟酌近似谋略,也便是我们可以经由过程结合自然说话属性,只将那些真正实际中呈现最多的那些词作为一个字典,使得这个规模可以放入内存。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: