| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 海量数据处理方法总结 -> 正文阅读 |
|
[大数据]海量数据处理方法总结 |
目录本文主要讲解海量数据处理方法的总结,由于字数较多,为了有更好的阅读体验,《海量数据处理问题总结》将放在另外一篇博客(此处为某链接,待更新) 数据时代来临,数据量的爆炸式增长是最为显著的特征。当高性能硬件的普及还跟不上这样的数据大潮时,如何在有限的时空资源内处理海量数据成为了计算机科学以及数理统计等领域最大的挑战。 海量数据处理海量数据处理,是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 海量数据处理的困难用一句话概括,就是时间和空间资源不够。具体来说,
对于时间受限的问题,我们一般的解决办法是高效的算法配合恰当的数据结构,比如哈希表,Bloom Filter,堆,倒排索引,Tire树;而对于空间受限的问题,一般的解决办法是“大而化小,分而治之”的策略,既然一次性行不通,那就一部分一部分读,每读入一部分可以生成一个小文件,小文件是可以直接读入内存的,我们这样分割大数据之后,再依次处理小文件的数据。 至于所谓的单机及集群问题,通俗点来讲,单机就是处理装载数据的机器有限(只要考虑 cpu,内存,硬盘的数据交互),而集群,机器有多个,适合分布式处理,并行计算(更多考虑节点和节点间的数据交互)。 处理海量数据问题的方法:
算法与数据结构基础STL容器分为三种:
关联式容器,关联式容器又分为set(集合)和map(映射表)两大类,以及这两大类的衍生体 multiset (多键集合)和 multimap (多键映射表),这些容器均以 RB-tree 完成。此外,还有第3类关联式容器,如 hashtable (散列表),以及以 hashtable 为底层机制完成的 hash_set (散列集合) / hash_map (散列映射表)、hash_multiset (散列多键集合)、hash_multimap (散列多键映射表)。也就是说,set/map、multiset、multimap都内含一个 RB-tree,而hash_set、hash_map、hash_multiset、hash_multimap都内含一个hashtable。 包括在非关联式数据库中,比如,在 MongoDB 内,文档(document)是最基本的数据组织形式,每个文档也是以 Key-Value(键-值对)的方式组织起来。一个文档可以有多个Key-Value组合,每个 Value 可以是不同的类型,比如String、Integer、List等等。 注:详细了解STL容器可移步STL容器介绍
综上,什么样的结构决定其什么样的性质,因为 set / map / multiset / multimap 都是基于 RB-tree 之上,所以有自动排序功能,而 hash_set / hash_map / hash_multiset / hash_multimap 都是基于 hashtable 之上,所以不含有自动排序功能,至于加个前缀 multi_ 无非就是允许键值重复而已。: 海量数据处理方法归纳分而治之 / hash 映射 + hash 统计 + 堆 / 快速 / 归并排序
这种方法是典型的“分而治之”的策略,也是解决空间限制最常用的方法。基本思路可以用下图表示。先借助哈希算法,计算每一条数据的hash值,按照hash值将海量数据分布存储到多个桶中(所谓桶,一般可以用小文件实现)。根据hash函数的唯一性,相同的数据一定在同一个桶中。如此,我们再依次处理这些小文件,最后做合并运算即可(有点类似于Map-Reduce的思想)
这里之所以使用堆排序,也是为了能尽可能地提高排序效率。就上例而言,堆排序的时间复杂度为 nklog(k)
如果问题更进一步,要求返回重复次数最多的 k 条数据,则可以将对比小文件找到的数据存入hash表,键为数据,值为该数据出现的次数。再用大小为 k 的堆,排序找出即可。 多层桶结构解决问题:海量数据求取第 k 大数;中位数;不重复或重复的数字 多层桶结构其实和最开始我们用 hash 映射分割大文件的思路是一致的,都是一种“分而治之”的策略。只不过多层桶结构是对有些桶分割之后再分割,构成了一种层次化的结构,它主要应用于一次分割的结果依然不能解决内存限制的情况。
Bitmap / Bloom filterBitmapBitmap 就是用一个 bit 位来标记某个元素对应的 Value, 而 Key 即是该元素。由于采用了 Bit 为单位来表示某个元素是否存在,因此在存储空间方面,可以大大节省。 Bitmap排序方法:
我们只想知道某个元素出现过没有。如果为每个所有可能的值分配1个 bit;但对于海量的、取值分布很均匀的集合进行去重,Bitmap 极大地压缩了所需要的内存空间。与此同时,还额外地完成了对原始数组的排序工作。缺点是,Bitmap 对于每个元素只能记录1bit信息,如果还想完成额外的功能,恐怕只能靠牺牲更多的空间、时间来完成了。 Bloom filter解决问题:数据字典的构建;判定目标数据是否存在于一个海量数据集;集合求交集 以存在性判定为例,Bloom Filter 通过对目标数据的映射,能够以 O(k) 的时间复杂度判定目标数据的存在性,其中 k 为使用的 hash 函数个数。这样就能大大缩减遍历查找所需的时间。 == 注:有关Bloom Filter树的详细讲解可以参考博客布隆过滤器(Bloom Filter)的原理和实现,建议去了解一下。宁可误报,不可错报==
问题5用的其实是一种简化了的Bloom Filter,不再采取hash映射的方式,而是直接根据整数的大小确定要改变的位数,这在某些特殊情况下(比如数据种类不多时)非常有效。 Trie树/数据库/倒排索引Trie树解决问题:当需要处理的是海量字符串数据时,有时Trie树会比直接上面说的hash映射的策略更高效。
其实,一棵完整的 Trie 树应该每个非叶节点都拥有 26 个指针,正好对应着英文的 26 个字母,这样整棵树的空间成本为26L,L 为最长字符串的长度。但是为了节省空间,我们可以根据字符串集本身为每个非叶节点,“量身定做”子节点。以上面的图为例,以 ”a” 开头的字符串中,第二个字符只有 ”a, b, c” 3种可能,我们当然没有必要为节点 u1 生成 26 个子节点了,3 个就够了。 除此之外,由于有些字符就是集合中其他字符的前缀,为了能够分辨清楚集合中到底有哪些字符串,我们还需要为每个节点赋予一个判断终止与否的bool值,记为endend。比如上图,由于同时存在字符串 {“a”,“ab”,“ac”,“aa”,“aab”,“aac”},我们就令节点 u1,u2 的 end 值为 True,表示从根节点到 u1,u2 的路径上的字符按顺序可以构成集合中一个完整的字符串(如”a”, “aa”)。图中,我们将end == True的节点标红。 Trie 树是一种非常强大的处理海量字符串数据的工具。尤其是大量的字符串数据中存在前缀时,Trie 树特别好用。Trie 树在字典的存储,字符串的查找,求取海量字符串的公共前缀,以及字符串统计等方面发挥着重要的作用。用于存储时,Trie 树因为不重复存储公共前缀,节省了大量的存储空间;用于以字符串的查找时,Trie 树依靠其特殊的性质,实现了在任意数据量的字符串集合中都能以 O(len) 的 时间复杂度完成查找(len 为要检索的字符串长度);在字符串统计中,Trie 树能够快速记录每个字符串出现的次数。 应用:
对于问题 b,除了朴素的比较法之外,我们还可以采取对每个字符串的所有前缀计算 hash 值的方法,这样一来,计算所有前缀 hash 值复杂度 O(n?len),len 为字符串的平均长度,查询的复杂度为 O(n)。虽然降低了查询复杂度,但是计算hash值显然费时费力。
总结一下,Trie树对于海量字符串数据,在数据种类有限(构建的Trie树可以完全读入内存)时,能够使我们轻松的进行存储,查找,计数等工作。 数据库索引适用范围:大数据量的增删改查 倒排索引(Inverted index)适用范围:搜索引擎,关键字查询 外排序适用范围:大数据的排序,去重 两个独立阶段:
外排序的优化方法:置换选择败者树原理,最优归并树。 提高外部排序需要考虑以下问题:
实例:
分布式处理之Hadoop/Mapreduce适用范围:数据量大,但是数据种类小可以放入内存 MapReduce是一种计算模型,分为”Map”和”Reduce”两个阶段:
这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,从而突破时间或者空间的限制。时间上显然更快,空间上,单个机器只需要处理空间允许的数据量即可。举个简单的例子就是归并排序,我们先将数据集分割成小数据集,使用多个机器排序每个分割后的小数据集(Map),再将处理好的归并段依次归并(Reduce)。 参考链接海量数据处理技巧 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:28:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |