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

问题:对于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

缺点:不支持非运算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 7,455评论 1 39
  • 摘要:本文将向您讲述诸多数据处理面试题以及方法的总结。 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出...
    拾壹北阅读 1,713评论 0 28
  • 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文...
    零一间阅读 948评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • 比较悠闲的一天 睡觉时间:23:57 起床时间:7:02 早饭:红薯 上午:单词,字帖,高数 午饭:麻辣拌,炒饭 ...
    Ingrid丰阅读 168评论 0 0