常见的处理方式
参考链接:
https://www.bilibili.com/video/BV1z44y1q7px?p=2&spm_id_from=pageDriver
● Hash法:哈希表。用于快速存取、统计某些数据,将大量数据进行分类。例如提取某日访问网站次数最多的IP地址等。
● Bit-map:使用位数组来表示某些元素是否存在。用于海量数据的快速查找、判重、删除等。如从8位电话号码中查找重复号码或统计不同号码的个数(可用多个bit表示一个数)。
● Bloom Filter:位数组+k个hash函数。定义m位初始化都为0的数组,每个函数都可以将元素映射到某一位。判断某个元素是否属于集合时,查看k个位是否全部为1。缺点:若都为1存在错误率、无法删除元素。如检查英文单词是否拼写正确、邮箱过滤垃圾邮件、找出两个各存放50亿条URL的文件中共同的URL。
● 数据库优化法:创建索引、配置缓存、切表分表、数据采样。
● 倒排索引法:正向索引用来存储每个文档的单词的列表,反向索引则是单词指向了包含它的文档。如常见的学术论文的关键词搜索。
● 外排序法:内存不能一次处理待排序的对象,必须把它以文件的形式存放于外存,排序时(归并排序)再把他们一部分一部分地调入内存进行处理。用于大文件的排序以及去重。
● Trie树:前缀树。根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点包含构成单词数量count。用于词频统计、前缀匹配、字符串排序。
● 堆:二叉堆。适用于海量数据求前N大(小顶堆)、前N小(大顶堆)或中位数(双堆)问题。如100w个数中找最大的前100个数。
● 双层桶:分而治之。因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。如5亿个整数中找出不重复的整数的个数(内存装不下)。将数据分离到不同的区域文件,不同的区域在利用bitmap来解决。
● MapReduce法:将数据划分并交给不同的机器去处理,结果归约。
1、链表和MAP
- 链表:海量数据占用内存比较大,查找排序效率比较低。O(n)
- MAP:海量数据占用内存比链表还大,但是查找效率比较高。O(1)
2、BITMAP 位图
- 本质:内存方面讲:字节(Byte)数组。 1Byte=8bit,JAVA里面有Byte数据类型,没有bit数据类型。
2.1 BITMAP的下标和元素位置的确定
- 一个数x(非负整数)若要存储在位数组里, 会面临两个问题:
-
x存储在第几个byte里?
因为一个byte可以存储8个bit,那很显然,x应该存储在第(x/8)个byte里。 -
x存储在第(x/8)个byte的第几位上?
通过观察,x应该存储在第(x%8)位上。
综上, x应该存储在第(x/8)个byte的第(x%8)位上。
在计算机里,位操作比除法和求模操作更高效点。x/8 相当于 x>>3(右移一位,相当于除以2;右移三位,相当于除以8);x%8相当于x&0x7。
2.2 BITMAP应用场景、优点和缺点
2.2.1 应用场景:
- 使用位数组来表示某些比较连续的海量数据是否存在。boolean类型:要么1:存在 要么0:不存在
- 数据状态不多的比较连续的海量数据的 数据的状态数量。可以用 多个BIT来存放状态,8(2的三次方)个状态的话用3BIT来存储一个元素。
- 优点:省空间 (MAX-MIN)* 状态位 /8bit /1024 B/1024 KB/1024MB
- 状态位: 1位 0:不存在, 1:存在
- 状态位: 2位 00:状态0, 01:状态1. 10:状态2,11:状态3
2.2.2 优点:
省空间,数据有序(根据byte数组下标和第(x/8)个byte的第几位 能对应数据)
2.2.3 缺点:
如果数据比较少,不连续,状态比较多。那么占用空间比较大 (MAX-MIN)* 状态位 数据比较大,占空间比较多。
3、Bloom Filter 布隆过滤器
- 本质实现:BITMAP和多个HASH算法(尽量减少HASH冲突)
3.1 特性:假阳性 误判
3.2 特点
3.3 具体使用
- 谷歌 guavaBloom