个人理解的海量数据处理方式

问题:对于1亿个url进行去重(每个url按照20字节来计算,20亿字节约占1.8G以上的空间,用hashset来实现显然不合理)

位图法

获取每一个URL的HashCode,根据HashCode的值来插入到bitmap的相应的位置,如果插入位置已经是1,说明URL已经重复。
优点:使用BitMap以后,每个url占了1个Bit。1亿个约占12M。最多不超过120M。
缺点:String的HashCode方法,在大量数据的情况下,也还是有冲突存在,会使得两个并不一样的url被映射到一个位图中。

布隆算法

以BitMap集合为基础的去重算法。
实现多个hash算法,使得每个URL都得到多个值,再比较不同的hash值。

  1. 将一个url用3种不同的hash算法映射成3个不同的值,并将这3个值存储到位图的相应位置去
  2. 将另一个url也用同样的hash算法映射成3个不同的hash值。
  3. 依次比较这个3个值是否相等,如果有一个不等,则将该url加入文件中。并将不等的hash值所在的位图置1;只有3个值都相等,才能判定二者相同。

会有一定的误判存在。

问题:实现用户信息的标签化,即一个用户可能对应成百上千个标签,并且随着标签的日益增多以及多个用户群体求并集时,只用sql语句进行数据库列表的查询,性能很低。

解决方法:位图法

由于每一个用户都对应位图中的一位,很不现实,毕竟标签太多,无法存储。
但是,一个用户对应多个标签,但是每个标签对应的都是用户,因此可以使用一个标签对应多个用户的情况。

  1. 建立一个用户名和用户id的映射
  2. 让每一个标签存储包含此标签的所有用户id,每个标签都是一个独立的BitMap。
  3. 这样直接通过找标签中的位图来找到用户id并最终映射成用户。

为什么优于HashSet或hashmap?
在HashSet或hashmap中,一个用户被ID需要存储为int类型,占4个字节即32bit,而在位图中,一个用户只占1bit,内存节省了32倍。

优势:程序员用户: 0000000110B
苹果手机用户:0000000100B
使用苹果的程序员用户:0000000110B&0000000100B=0000000100B

缺点:不支持非运算

你可能感兴趣的:(个人理解的海量数据处理方式)