GeekBand C++系统设计与实践 第三周

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
  • Wechat

功能

  • 朋友关系
  • 发消息
  • 收消息
  • 查看聊天记录

工作流

  • 选择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个,且它们都是完全随机的(出现概率均等)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容