[原创] 学习笔记:海量数据处理总结

  本文简要总结了一下海量数据处理的常见方法和思路。总结的比较粗糙,主要作为知识提纲使用。请各位高手不吝赐教。

  另外,最近在BAE上学习用 WordPress 搭建了独立博客,欢迎大家有空去转转!本博客文章将同步更新。

  博客地址:http://panwenhai.duapp.com/

  

1、海量数据处理总体思路:分配任务、单独解决、合并结果
  • 分配任务:
    • 分而治之Hash
    • 桶划分思想
  • 单独解决:
    • 统计各个元素出现的次数:Hash Map,N-Bit Map,Trie-Tree,倒排索引
    • 找寻最大(小)的N个元素:堆结构,快排思想,局部淘汰法
    • 查找给定元素是否存在在其中:Hash Map,1-Bit Map,Bloom Filter,高位比较
    • 寻找中位数:桶划分思想
    • 搜索引擎,查找关键字:倒排索引
  • 合并结果:
    • 1、归并排序思想合并
    • 2、桶划分思想合并
2、分而治之+Hash
  • 通过Hash取模的方法( Hash(ip)%1024 ),将大量数据分成一个一个的小文件,再进行处理(内排序)。
  • Hash取模的方法,使得相同的元素,会被分配到相同的文件中,对于单独文件操作,就可以得到对应元素的结果。
  • 处理之后,采用归并的方法,对于小文件的结果进行合并,从而得到最终结果(外排序)。
  • 当数据量较大,而又必须进行彻底的处理时,可以采用这种思想
 
3、Hash Map
  • 通过一次扫描,可以建立Key与Value对的hash表,来统计某个元素出现的次数。
 
4、N-Bit Map 位图方法
  • 与 Hash Map 相似,只是Key通常为元素值进行直接索引,value值为bit串,用来记录某个元素的状态。
  • N的大小控制bit串长度,用来控制状态的总数。(如:N=2时,00表示不存在,01表示出现一次,10表示出现多次,11无意义)
  • Bit Map 本身的长度,表示可记录元素的个数
  • 当N = 1,采用元素值作为地址直接索引时,可以表示40亿个不重复的unsigned int值是否存在。
 
5、Bloom Filter
  • 有一定错误概率,但相比于单纯的bit_set节省空间。
  • bit_set + k个独立hash函数:将hash函数的结果作为索引值,将对应位置1。查找元素时,如果发现K个hash函数所得到的位置都是1,则认为对应元素存在。
  • 输入元素个数n,确定位数组m的大小及hash函数个数
    • m应该>=nlg(1/E)*lge
    • k=(ln2)*(m/n)
  • Bloom Filter:元素 映射为  位数组
  • Counting Bloom Filter:在Bloom filter 中的位扩展为 counter,支持删除操作。
  • Spectral Bloom Filter:将元素与出现次数关联。
 
6、堆结构
  • 通过堆的特性,找寻出现最多(少)的前N个元素。
  • 需要先统计出各个元素出现的次数(可以用Hash Map),这一步只是找前N个。
  • 找最多,用小顶堆,找最大,用大顶堆(先比较堆顶元素,如果不满足要求,则直接轮询下一个,如果符合要求,插入堆中)
  • 时间复杂度O(X log Y),X为所有元素的个数,Y为堆中元素的个数
  • 扩展:双堆,一个大顶堆和一个小顶堆,可以用来维护中位数。大顶堆存储较小的一半数字,小顶堆存储较大的一半数字。每次插入元素后,适当移动根节点保持两个堆数字相等或相差1.
 
7、Trie 树
  • 前缀树,统计各个单词出线的次数。
  • 每个节点都是一个字母,前缀相同的,就不新建节点了。节点的内容是这个单词出现的次数。
  • 时间复杂度: O(n*le)(le表示单词的平准长度)
 
8、快排思想找前N个元素
  • 利用快速排序思想,每次分割时,仅考虑满足要求的一些,当接近N时,采用普通排序算法排序。
 
9、局部淘汰法找前N个元素
  • 从所有数据中,选取前N个元素,排序。然后扫描剩余元素,与排好序的最后一个元素相比,如果比它小(大),则删除最后一个元素,利用插入排序法的思想插入序列中。
  • 时间复杂度:O(100w*100)
 
10、MapReduce思想
  • 在用分而治之hash分配任务后,并不一个一个文件进行处理,而是采用分布式的方法,同时处理多个文件,在处理之后,再进行合并。
 
11、桶划分
  • 本质上是分而治之,重在“分”的技巧
  • 划分元素的取值范围,将落在一个范围内的元素分成一组
  • 单独处理每一组的元素,最终合并结果
  • 如:找中位数,将int划分成2^16个区域,统计在各个区域内的数字个数,就可以判断出在哪个区域的第几个元素就是中位数。然后对那个区域内的元素排序即可获得
 
12、高位比较
  • 从很多数中,查找某一个数字是否出现过。
  • 由最高位开始比较,0,1二分,之后依次类推。近似于折半查找。O(logn)
 
13、倒排索引
  • 单词作为索引,单词出现的位置所组成的集合做为内容。
  • 搜索引擎,关键字查询,查找那些文件包含了对应关键字。

 

谢谢您阅读本文!作者独立博客地址:http://panwenhai.duapp.com/,欢迎大家有空去转转!

 

转载于:https://www.cnblogs.com/icemoon1987/p/3625513.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解一些相关的知识,下面是一些学习笔记: 1. gstreamer是一个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是一种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建一个gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建一个gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输的效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值