2015-12-01 16:26:04 +08:00
|
|
|
|
|
|
|
|
## 海量数据处理
|
|
|
|
|
|
2015-12-05 00:55:44 +08:00
|
|
|
所谓海量数据,就是数据量太大,要么在短时间内无法计算出结果,要么数据太大,无法一次性装入内存。
|
|
|
|
|
|
2015-12-05 16:09:41 +08:00
|
|
|
针对时间,我们可以使用巧妙的算法搭配合适的数据结构,如bitmap/堆/trie树等
|
2015-12-05 00:55:44 +08:00
|
|
|
针对空间,就一个办法,大而化小,分而治之。常采用hash映射
|
|
|
|
|
|
2015-12-01 16:26:04 +08:00
|
|
|
|
2015-12-11 19:27:48 +08:00
|
|
|
* Hash映射/分而治之
|
|
|
|
|
* Bitmap
|
|
|
|
|
* Bloom filter(布隆过滤器)
|
2015-12-13 20:39:33 +08:00
|
|
|
* 双层桶划分
|
2015-12-11 19:27:48 +08:00
|
|
|
* Trie树
|
|
|
|
|
* 数据库索引
|
|
|
|
|
* 倒排索引(Inverted Index)
|
|
|
|
|
* 外排序
|
|
|
|
|
* simhash算法
|
|
|
|
|
* 分布处理之Mapreduce
|
|
|
|
|
|
|
|
|
|
|
2015-12-05 16:09:41 +08:00
|
|
|
### 估算
|
|
|
|
|
|
|
|
|
|
在处理海量问题之前,我们往往要先估算下数据量,能否一次性载入内存?如果不能,应该用什么方式拆分成小块以后映射进内存?每次拆分的大小多少合适?以及在不同方案下,大概需要的内存空间和计算时间。
|
|
|
|
|
|
|
|
|
|
比如,我们来了解下以下常见问题`时间` 和 `空间` 估算 :
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
8位的电话号码,最多有99 999 999个
|
|
|
|
|
IP地址
|
2015-12-05 17:15:46 +08:00
|
|
|
1G内存,2^32 ,差不多40亿,40亿Byte*8 = 320亿 bit
|
2015-12-05 16:09:41 +08:00
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
2015-12-01 16:26:04 +08:00
|
|
|
海量处理问题常用的分析解决问题的思路是:
|
|
|
|
|
|
|
|
|
|
* 分而治之/Hash映射 + hash统计/trie树/红黑树/二叉搜索树 + 堆排序/快速排序/归并排序
|
|
|
|
|
* 双层桶划分
|
|
|
|
|
* Bloom filter 、Bitmap
|
|
|
|
|
* Trie树/数据库/倒排索引
|
|
|
|
|
* 外排序
|
|
|
|
|
* 分布处理之 Hadoop/Mapreduce
|
|
|
|
|
|
|
|
|
|
|
2015-12-05 00:55:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-12-05 16:09:41 +08:00
|
|
|
|
2015-12-05 00:55:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-12-13 20:39:33 +08:00
|
|
|
|
2015-12-05 16:09:41 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|