01 概述
大数据必然涉及海量数据,所谓海量数据,就是数据量太大,要么在短时间内无法计算出结果,要么因为数据太大无法一次性装入内存。
针对时间,我们可以使用巧妙的算法搭配合适的数据结构,如bitmap/堆/trie树等进行优化。
针对空间,就一个办法,大而化小,分而治之,常采用hash映射等方法。
02 hash映射
这里的hash映射是指通过一种哈希算法,将海量数据均匀分布在对应的内存或更小的文件中,这是一种分而治之的实现思想。
使用Hash映射有个最重要的特点是: Hash值相同的两个串不一定一样,但是两个一样的字符串hash值一定相等(如果不相等会存在严重安全问题,比如两个人的账号信息经过哈希后映射到同一个值)。
如下所示:
在使用hash映射的时候,选择合适高效的Hash函数是关键,选择的不好不仅浪费空间,而且效率不高,存在冲突的可能性较大。当出现冲突的时候,还需要借助各种冲突检测方法去解决。
03 bitmap
用1个(或几个)bit位来标记某个元素对应的value(如果是1bitmap,就只能是元素是否存在;如果是x-bitmap,还可以是元素出现的次数等信息)。使用bit位来存储信息,在需要的存储空间方面可以大大节省。
应用场景有:
1、排序(如果是1-bitmap,就只能对无重复的数排序)
2、判断某个元素是否存在
例如,某文件中有若干8位数字的电话号码,要求统计一共有多少个不同的电话号码?
分析:8位最多99 999 999, 如果1Byte(8bit)表示1个号码是否存在,需要99999999Byte=99999999/1024KB=99999999/1024/1024MB≈95MB