海量数据处理

一 大量字符串

  1. A,B两个文件各存放50亿条URL,每条URL占用64字节,内存限制4G,找出A,B文件共同的URL

答:1G文件的大致字节数:2^30 约等于 1的9次方(2的10次方约等于100) 所以50亿条URL大概为5*64=320G,所以将大文件分为1000个小文件,怎么分,每个URL进行hashcode再对1000取余。这个A文件就被分为(a0,…a999)了,同样的对B进行这样操作,B文件就被分为(b0,…b999)了。因为是取余,所以相同的URL肯定会出现在相同下标的文件中。 判断的逻辑是先将a文件全部放到HashSet中,然后把b中内存依次做判断。

  1. 1G大小的文件,里面每行是一个词,词的大小不超过16字节,内存限制大小是1M,返回频数最高的100个词

a、顺序读文件,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件中,这样每个文件大概200K左右。如果其中有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件中出现的词及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个节点的最小堆),并把100个词对应的频率存入文件,这样又取到了5000个文件。下一步就是把这5000个文件进行归并
b、这个数据具有很明显的特点,词的大小为 16 个字节,但是内存只有 1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。

二 大量数字

  1. 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

方案一
申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。
方案二
因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;这里我们把40亿个数中的每一个用32位的二进制来表示,假设这40亿个数开始放在一个文件中。然后将这40亿个数分成两类:
1.最高位为0
2.最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找再然后把这个文件为又分成两类:
1.次最高位为0
2.次最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了); 与要查找的数的次最高位比较并接着进入相应的文件再查找。以此类推,就可以找到了,而且时间复杂度为O(logn)。

三 一些工具介绍

  1. bitMap(位图)
    原理就是开辟一个bit数组,数组的下标就是对应插入的值,比如你向这个bit数组插入6这个数字,那么它就是在数组下标为6的位置,将这个位置的值设为1,标识有6这个值。判断一个数字存不存在挺好用的。
    bitMap:https://juejin.im/post/5c4fd2af51882525da267385
  2. 布隆过滤器
    原理就是开辟一个bit数组,对目标数据先进行hash,取得值后,找到这个值对应数组下标(比如10),将这个下标对应的值设为1。当查询一个值存不存在时,同样对查询的值进行hash,拿到对应数组下标,如果对应数组下标值为0 ,则一定不存在。如果为1,则大概率存在。为了提高准确性,进行hash时,会调用不同hash函数,拿到不同的hash值。
  3. 字典树 (trie树)
    海量数据处理_第1张图片海量数据处理_第2张图片
    https://juejin.im/post/5c2c096251882579717db3d2
    https://zhuanlan.zhihu.com/p/28891541

参考:
https://www.e-learn.cn/topic/2016917

你可能感兴趣的:(海量数据处理)