5.海量数据处理方法
- 1)Hash
- 2)Bit-Map
- 3)Bloom Filter
- 4)堆(Heap)
- 5)双层桶划分
- 6)数据库索引
- 7)倒排索引(Inverted Index)
- 8)B+树
- 9)Trie树
- 10)MapReduce
Hash
把任意长度的输入(又叫预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。
25.png
Bit-Map
所谓的Bit-Map就是用一个bit位来标记某个元素对应的value,而Key即是该元素。由于采用了bit为单位来存储数据,因此在存储空间方面,可大大节省。
Bloom Filter
就是带随机概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定的那个数据的。于是我就可以不用二分查找,而只需要简单的计算几次就能知道数据是否在某个小集合里了。效率得到了提升,但是付出的是空间代价。
26.png
Heap
堆是一种特殊的二叉树,具备以下两种性质:
- 1)每个节点的值都大于(或者小于,称为最小堆)其子节点的值
- 2)数是完全平衡的,并且最后一层的树叶都在最左边
这样就定义了一个最大堆
适用范围 韩相数据前n大,并且n比较小,堆可以放入内存。
双层桶
算法设计思想。面对一堆大量的数据我们无法处理的时候,我们可以将其分成一个个小的单元,然后根据一定的策略来处理这些小单元,从而达到目的。
例子: 第K大,中位数,不重复或重复的数字
因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子,分治才是其根本(只分不治)。
数据库索引
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
例如这样一个查询,select * from table1 where id=44;如果没有索引,必须遍历整个表,直到id=44这一行被找到为止;有了索引之后(必须在id这一列上建立索引),直接在索引里面找44(也就是id这一列找),就可以得知这一行的位置,也就是找到了这一行。索引是用来定位的。
- 经常变动的表,不适合建立索引,要经常进行动态维护
- 索引要占用空间
倒排索引
一种索引方法,被用来存储在全文索索下某个单次在一个文档或者一组文档中的存储位置的映射。
以英文为例,下面是要被索引的文本:
- 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"将对应集合的交集。
外排序
外排序的归并方法,置换选择败者树,最优归并数
B+树
B+树,因为其构建过程中引用了有序数组,从而有效的降低了树的高度,一次取出一个连续的数组,这个操作在磁盘上比取出与数组相同数量的离散数据,成本要低很多。因此磁盘上基本都是B数结构。
27.png
Trie Tree
Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。
适用范围:数据量大,重复多,但是数据种类小可以放入内存。
28.png
分布式MapReduce
适用范围:数据量大,但是数据种类小可以放入内存
29.png
6.海量数据案例
综合案例
上千万or亿数据(有重复),统计其中出现次数最多的前N个数据,分两种情况:可一次性读入内存,不可一次读入。
可用思路:trie树+堆,数据库索引,划分子集分别统计,hash,分布式计算,近似统计,外排序。
Look Up Connection
设计一个社交网络系统,支持查询用户之间的联系。
Request Count
给定一个可以处理请求的服务器,设计一个数据结构可以获取在最后一秒,一分钟或一小时的请求数量。
电商网站1.0
- Taobao,Amazon
-
single machine
30.png
技术选型
- Login: Session/Cookie
- Web Server: Apache/PHP/Ngix
- MVC: Templates, Spring
- DB: MySQL
电商网站2.0
SOA(Service Oriented Architecture)
31.png
电商网站3.0
32.png电商网站4.0
33.png聊天系统
- Facebook Message
功能
- 朋友关系
- 发消息
- 收消息
- 查看聊天记录
工作流
- 选择1:A send to B directly(浏览器to浏览器,手机to手机)
- 劣势:浏览器不支持P2P,没有云端历史记录,没有多个服务器
- 选择2:A send to server,B read from server or server Send to B
Q1: How to store messages?
Database: NoSQL vs. SQL
- SQL: message
- {sender, recipient, created_at, seen_status, text} 2 queries
- NoSQL:
- key:User
- Column key:{conversation_id, created_at} conversation_id = sort([sender, recipient])
- Value:{text, seen_status} 1 fast query
Q2: Get new message
Pull vs. Push
- Pull:
- Mobile/Web: HTTP request
- Pull every 3s?
Followup Q1: Multiple Devices
- Sync Content
- last read message
Followup Q2: Online Status
- 如何存储这个状态(最后上线时间)
- 如何获取这个状态
- 心跳
- 如何排序好友列表
Followup Q3: Conversation List
- Conversation Schema
- Ordered by last activity
Followup Q4: Group Chat
- Group Message
- key: User Id
- Column Key: (conversation_id, created_at, type)
- conversation_id = uuid()
- type: text or seen status
- value {someong, text} or {someont, seen}
- Where to store recipient list?
Top K
搜索引擎会通过日志问价你把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有1000万个记录,这些查询串的重复度比较高,虽然总数是1000万,但是如果去重后,不超过300万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
- 排序(内存使用较高)
- 部分排序
- 堆
从10亿查询词中找出出现频率最高的10个
- 单机+单核+足够大内存
- 单机+多核+足够大内存
- 单机+单核+受限内存
- 多机+受限内存
MapReduce
数据抽样
给你一个长度为N的链表。N很大,但是你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们都是完全随机的(出现概率均等)。
网友评论