海量数据处理

article/2025/9/25 11:43:50

目录

补充

                 

1.位图应用

(1)给定100亿个整数,设计算法找到只出现一次的整数

(2)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件的交集

(3)一个文件有100亿个整数,1G内存,设计算法找到出现次数不超过2次的所有整数。

2.布隆过滤器应用

(1)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?给出近似算法。 

(2)如何扩展BloomFilte使得它支持删除元素的操作

3.哈希切割应用

(1)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?给出精确算法。

(2)给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址?如何找到top K的IP?如何直接用Linux系统命令实现? 


 

补充

海量数据处理是指基于海量数据的存储和处理,正因为数据量太大,所以导致要么无法在短时间内迅速处理,要么无法一次性装入内存。

  • 对于时间问题,就可以采用位图、布隆过滤器等数据结构来解决。
  • 对于空间问题,就可以采用哈希切割等方法,将大规模的数据转换成小规模的数据逐个击破。

                 

                 

                

1.位图应用

(1)给定100亿个整数,设计算法找到只出现一次的整数

①我们标记整数时可以将其分为三种状态:

  • 出现0次                   00
  • 出现1次                   01
  • 出现2次及以上        10

②解释 

  • 一个位只能表示两种状态,而要表示三种状态我们至少需要用两个位,因此我们可以开辟两个位图,这两个位图的对应位置分别表示该位置整数的第一个位和第二个位。
  • 我们可以将着三种状态分别定义为00、01、10,此时当我们读取到重复的整数时,就可以让其对应的两个位按照00→01→10的顺序进行变化,最后状态是01的整数就是只出现一次的整数。

③代码示例

#include <iostream>
#include <vector>
#include <assert.h>
#include <bitset>
using namespace std;int main()
{//此处应该从文件中读取100亿个整数vector<int> v{ 9, 34, 8, 72, 3, 45, 9, 8, 27, 3, 2, 3, 45, 8, 45};//在堆上申请空间bitset<4294967295>* bs1 = new bitset<4294967295>;bitset<4294967295>* bs2 = new bitset<4294967295>;//bitset<-1> bs;//处理数据for (auto e : v){if (!bs1->test(e) && !bs2->test(e)) //00->01{bs2->set(e);}else if (!bs1->test(e) && bs2->test(e)) //01->10{bs1->set(e);bs2->reset(e);}else if (bs1->test(e) && !bs2->test(e)) //10->10{//不做处理}else //11(理论上不会出现该情况,保证代码的完整性){assert(false);}}for (size_t i = 0; i < 4294967295; i++){if (!bs1->test(i) && bs2->test(i)) //01cout << i << endl;}return 0;
}

④补充

  • 存储100亿个整数大概需要40G的内存空间,因此题目中的100亿个整数肯定是存储在文件当中的,代码中直接从vector中读取数据是为了方便演示。
  • 为了能映射所有整数,位图的大小必须开辟为2^32位,也就是代码中的4294967295,因此开辟一个位图大概需要512M的内存空间,两个位图就要占用1G的内存空间,所以代码中选择在堆区开辟空间,若是在栈区开辟则会导致栈溢出。

                 

(2)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件的交集

①方法1:(一个位图需要512M内存)

  • 依次读取第一个文件中的所有整数,将其映射到一个位图。
  • 再读取另一个文件中的所有整数,判断在不在位图中,在就是交集,不在就不是交集。

②方法2:  (两个位图刚好需要1G内存,满足要求)

  • 依次读取第一个文件中的所有整数,将其映射到位图1。
  • 依次读取另一个文件中的所有整数,将其映射到位图2。
  • 将位图1和位图2进行 操作,结果存储在位图1中,此时位图1当中映射的整数就是两个文件的交集。

对于32位的整型,无论待处理的整数个数是多少,开辟的位图都必须有 2^32 个比特位,也就是512M,因为我们要保证每一个整数都能够映射到位图当中,因此这里位图的空间消耗是固定的。
                

(3)一个文件有100亿个整数,1G内存,设计算法找到出现次数不超过2次的所有整数。

①该题目和(1)中的方法是一样的,在该题目中我们标记整数时可以将其分为四种状态:

  • 出现0次             00
  • 出现1次             01
  • 出现2次             10
  • 出现2次以上      11

                 

②一个整数要表示四种状态也是只需要两个位就够了,此时当我们读取到重复的整数时,就可以让其对应的两个位按照00→01→10→11的顺序进行变化,最后状态是01或10的整数就是出现次数不超过2次的整数

                 

③代码

#include <iostream>
#include <vector>
#include <bitset>
using namespace std;int main()
{vector<int> v{ 9, 34, 8, 72, 3, 45, 9, 8, 27, 3, 2, 3, 45, 8, 45};//在堆上申请空间bitset<4294967295>* bs1 = new bitset<4294967295>;bitset<4294967295>* bs2 = new bitset<4294967295>;for (auto e : v){if (!bs1->test(e) && !bs2->test(e)) //00->01{bs2->set(e);}else if (!bs1->test(e) && bs2->test(e)) //01->10{bs1->set(e);bs2->reset(e);}else if (bs1->test(e) && !bs2->test(e)) //10->11{bs2->set(e);}else //11->11{//不做处理}}for (size_t i = 0; i < 4294967295; i++){if ((!bs1->test(i) && bs2->test(i)) || (bs1->test(i) && !bs2->test(i))) //01或10cout << i << endl;}return 0;
}

                 

                

         

2.布隆过滤器应用

(1)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?给出近似算法。 

题目要求给出近似算法,也就是允许存在一些误判,可以用布隆过滤器:

  • 先读取其中一个文件当中的query,将其全部映射到一个布隆过滤器当中。
  • 然后读取另一个文件当中的query,依次判断每个query是否在布隆过滤器当中,如果在则是交集,不在则不是交集。

                         

(2)如何扩展BloomFilte使得它支持删除元素的操作

①布隆过滤器一般不支持删除操作

  • 因为布隆过滤器判断一个元素存在时可能存在误判,因此无法保证要删除的元素确实在布隆过滤器当中,此时将位图中对应的比特位清0会影响其他元素。
  • 此外,就算要删除的元素确实在布隆过滤器当中,也可能该元素映射的多个比特位当中有些比特位是与其他元素共用的,此时将这些比特位清0也会影响其他元素。

                 

②如果要让布隆过滤器支持删除,就必须要做到以下两点:

  • 保证要删除的元素在布隆过滤器当中,比如在删除一个用户的信息前,先遍历数据库确认该用户确实存在。
  • 保证删除后不会影响到其他元素,比如可以为位图中的每一个比特位设置一个对应的计数值,当插入元素映射到该比特位时将该比特位的计数值++,当删除元素时将该元素对应比特位的计数值 -- 即可。

                 

                

                

3.哈希切割应用

(1)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?给出精确算法。

①基本思路

  • 首先需要估算一下这里一个文件的大小,便于确定将一个文件切分为多少个小文件。
  • 假设平均每个query为20字节,1G大约10亿bite , 那么100亿个query就是200G,由于我们只有1G内存,这里可以考虑将一个文件切分成400个小文件,每个小文件512M。
  • 这里我们将这两个文件分别叫做A文件和B文件,此时我们将A文件切分成了A0~A399共400个小文件,将B文件切分成了B0~B399共400个小文件。

                 

②在切分时需要选择一个哈希函数进行哈希切分

  • 以切分A文件为例,切分时依次遍历A文件当中的每个query,通过哈希函数将每个query转换成一个整型 i (0 ≤ i ≤ 399),然后将这个query写入到小文件Ai当中。对于B文件也是同样的道理,但切分A文件和B文件时必须采用的是同一个哈希函数
  • 由于切分A文件和B文件时采用的是同一个哈希函数,因此A文件与B文件中相同的query计算出的 i 值都是相同的,最终就会分别进入到Ai和Bi文件中,这也是哈希切分的意义。
     

                 

③只需要分别找出A0与B0的交集、A1与B1的交集、…、A399与B399的交集,最终将这些交集和起来就是A文件和B文件的交集。

                 

④各个小文件之间又应该如何找交集

  • 经过切分后理论上每个小文件的平均大小是512M,因此我们可以将其中一个小文件加载到内存,并放到一个set容器中,再遍历另一个小文件当中的query,依次判断每个query是否在set容器中,如果在则是交集,不在则不是交集。
  • 当哈希切分并不是平均切分,有可能切出来的小文件中有一些小文件的大小仍然大于1G,此时如果与之对应的另一个小文件可以加载到内存,则可以选择将另一个小文件中的query加载到内存,因为我们只需要将两个小文件中的一个加载到内存中就行了。
  • 但如果两个小文件的大小都大于1G,那我们可以考虑将这两个小文件再进行一次切分,将其切成更小的文件,方法与之前切分A文件和B文件的方法类似。

                         

⑤本质这里在进行哈希切分时,就是将这些小文件看作一个个的哈希桶,将大文件中的query通过哈希函数映射到这些哈希桶中,如果是相同的query,则会产生哈希冲突进入到同一个小文件中。

  • 哈希切分的意义是: 相同的查询字符串(使用同一个hash算法)进入相同的小文件
  • 哈希切分特点: A和B文件中相同的query,分别进入了,Ai和Bi文件中下标相同的小文件
     

                 

(2)给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址?如何找到top K的IP?如何直接用Linux系统命令实现? 

                 

①找到次数最多

  • 我们将这个log file叫做A文件,由于A文件的大小超过100G,这里可以考虑将A文件切分成100个小文件。
  • 在切分时选择一个哈希函数进行哈希切分,通过哈希函数将A文件中的每个IP地址转换成一个整型 i (0 ≤ i ≤ 99),然后将这个IP地址写入到小文件Ai当中。
  • 由于哈希切分时使用的是同一个哈希函数,因此相同的IP地址计算出的 i  值是相同的,最终这些相同的IP地址就会进入到同一个Ai小文件当中。
  • 经过哈希切分后得到的这些小文件,理论上就能够加载到内存当中了,如果个别小文件仍然太大那可以对其再进行 一 次哈希切分,让最后切分出来的小文件能够加载到内存。
  • 现在要找到出现次数最多的IP地址,就可以分别将各个小文件加载到内存中, 然后用一个map<string, int>容器统计出每个小文件中各个IP地址出现的次数,然后比对各个小文件中出现次数最多的IP地址,最终就能够得到log file中出现次数最多的IP地址。

②找到top K的IP

  • 如果要找到出现次数top K的IP地址,可以先将一个小文件加载到内存中,选出小文件中出现次数最多的K个IP地址建成一个小堆,然后再依次比对其他小文件中各个IP地址出现的次数,如果某个IP地址出现的次数大于堆顶IP地址出现的次数,则将该IP地址与堆顶的IP地址进行交换,然后再进行一次向下调整,使其仍为小堆,最终比对完所有小文件中的IP地址后,这个小堆当中的K个IP地址就是出现次数top K的IP地址。
     

                         

③Linux系统命令实现 

  • 可以用sort log_file | uniq -c  | sort -nrk1,1 | head -k 命令选取出现次数top K的IP地址

  • 1.创建log_file文件并填充数据 

                                 

  • 2.使用sort命令对log_file文件进行排序。 

                         

  • 3.使用uniq命令统计每个IP地址出现的次数。 

                         

  •  4.刚才使用sort命令只是以字母序进行文本排序,现在统计出了每个IP地址出现的次数,所以需要再次使用sort命令按照每个IP底层出现的次数进行反向排序。

         

  •  5.最后使用head 命令选出出现次数top K的IP地址即可

 


http://chatgpt.dhexx.cn/article/eQxFoWIc.shtml

相关文章

H264视频码流格式浅析

针对H264码流格式说明&#xff0c;网上已经有很多介绍了&#xff0c;最近也在看这个&#xff0c;这里根据自己理解&#xff0c;做个记录。 1、H264的功能分为两层&#xff1a;视频编码层(VLC,Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)。VLC数据即 编码…

H.264(H264)视频文件的制作

一、准备工作 1.下载并安装优酷客户端 2.下载ffmpeg可执行文件&#xff0c;解压可用&#xff0c;不需要下载源码自己编译。 ffmpeg可执行文件下载链接&#xff1a;http://download.csdn.net/detail/caoshangpa/9492758 二、用优酷客户端下载视频并转码 用优酷客户端下载一…

H264和H265区别

很多小伙伴应该都听过H.265和H.264这两种编码&#xff0c;也了解专业术语的解释。包括电视机 都会标注支持H.265格式4K视频编码&#xff0c;视频监控系统也会 标注支持H.265。但是在没有用过的情况下&#xff0c;很难说真的已经 知道两者的区别了&#xff0c;那么H.265和H.264这…

H264 编解码协议详解

1.、什么是 H264&#xff1f; H264 是 MPEG-4 标准所定义的最新编码格式&#xff0c;同时也是技术含量最高、代表最新技术水平的视频编码格式之一&#xff0c;标准写法应该是H.264 H264 视频格式是经过有损压缩的&#xff0c;但在技术上尽可能做的降低存储体积下获得较好图像…

视频和视频帧:H264编码格式整理

本文将介绍的是&#xff1a; H264的发展历史。将介绍H26x和MPEG家族的发展和关联。H264的编码格式。主要介绍VCL和NAL&#xff0c;前者与视频编码数据紧密相关&#xff0c;后者和H264格式相关&#xff0c;也是本文介绍的重点。NAL。介绍NAL的组成单元&#xff1a;NALU。包括NA…

h264文件视频存储格式和音频存储格式

mp4封装 目录 h264视频流格式介绍 aac音频流格式介绍 h264视频文件读取 通过帧索引解析h264文件 通过解析h264结构读取文件 aac音频文件读取 mp4封装 初始化 数据封装 关闭mp4文件句柄 注意点 目录 h264视频流格式介绍 视频数据帧分为I帧,P帧,B帧,其中I帧为关键帧,所包含的图像…

H264和h265编码

未压缩的码流&#xff1a;一秒钟码流大小:640x480x1.5x15x855296000 (是55MB)其中 1.5是yuv占用1.5倍&#xff0c;rgb是3倍,8是一个字节是八位bit H264的建议码流是500kpbs,因此压缩比是100 电影一般帧率大于60帧&#xff1b;在线教育&#xff0c;实时通信一般是15帧 工具使…

H264格式 详细介绍

原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 &#xff1a; 视频的一场或一帧可用来产生一个编码图像。在电视中&#xff0c;为减少大面积闪烁现象&#xff0c;把一帧分成两个隔行的场。 片&#xff1a; 每个图象中&…

H264码流格式

h264码流格式 码流格式 …NAL头RBSPNAL头RBSPNAL头RBSP… H264 传输 SPSSEIPPSI片图像定界符P片P片 NAL头格式 start code ( 3 or 4 )forbidden_zero_bit&#xff08;1&#xff09;nal_ref_idc (2)nal_unit_type&#xff08; 5&#xff09;RBSP 解释 start code&#xf…

H264H265格式

文章目录 H2641. NALU1.1 NALU Header1.1.1 nal_unit_type 2. 码流格式2.1 Annex B格式2.2 AVCC格式2.2.1 extradata结构 2.3 H264 Annexb与AVCC格式转换 3. 视频编码帧3.1 压缩方式3.2 编码帧3.3 丢帧 4. PTS与DTS4.1 概念4.2 为什么需要PTS&#xff0c;DTS&#xff1f; H2651…

音视频——视频流H264编码格式

1 H264介绍 我们了解了什么是宏快&#xff0c;宏快作为压缩视频的最小的一部分&#xff0c;需要被组织&#xff0c;然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用宏快来发送数据是杂乱无章的&#xff0c;就好像在没有集装箱 出现之前&#xff0c;…

H264编码简介

H264编码简介 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩…

H264格式

原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 &#xff1a; 视频的一场或一帧可用来产生一个编码图像。在电视中&#xff0c;为减少大面积闪烁现象&#xff0c;把一帧分成两个隔行的场。 片&#xff1a; 每个图象中…

H264格式解析

H264码流有两种形式&#xff1a;Annex B和AVCC。这两种码流形式所对应不同的编码方式和格式解析。 Annex B中每个NALU中没有存储NALU长度字节 AVCC中每个NALU中存储了长度信息 H264编码分为两层&#xff1a;vcl和nal vcl&#xff1a;编码nal&#xff1a;网络传输 Annex B的编…

H264编码基础概念+格式分析

一、编码基础概念 1、为什么要进行视频编码&#xff1f; 视频是由一帧帧图像组成&#xff0c;就如常见的gif图片&#xff0c;如果打开一张gif图片&#xff0c;可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿&#xff0c;一秒钟至少需要16帧画面&#xff08…

H264编码格式--图文解释

一、H264格式 RBSP SODB RBSP trailing bits NALU NAL header(1 byte) RBSP H.264 Start Code Prefix(3 bytes) NALU Start Code Prefix(3 bytes) NALU … H.264从层次来看分为两层&#xff1a;视频编码层&#xff08;VCL&#xff0c; Video Coding Layer&#xf…

【音视频基础】H264格式分析

介绍 H264是基于运动补偿的视频编码标准。所谓编码我的理解就是对数据进行压缩便于网络传输。而视频编码就是依据图像帧的像素块之间的相似性对图像进行压缩。 相关概念 H264结构中&#xff0c;一幅图像编码后的数据叫一帧&#xff0c;一帧由一个或多个Slice片组成&#xff…

h264粗略理解

奔着学习的态度&#xff0c;借此试用期要输出文档&#xff0c;把h264的格式和相关知识深入梳理一下。 流媒体分析工具&#xff1a;Elecard StreamEye 一、h264认识 h264是一种视频编码标准&#xff0c;跟常见的视频格式不属于同一类。H.264同时也是MPEG-4第10部分规范(ISO/IEC…

H264简介

H.264是国际标准化组织&#xff08;ISO&#xff09;和国际电信联盟&#xff08;ITU&#xff09;共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG&#xff08;视频编码专家组&#xff09;和ISO…

阿里云单位网站备案承诺书填写(单位/个人)

阿里云单位网站备案承诺书填写 第一个填写「阿里云计算有限公司」 第二个填写公司所在省份/直辖市「深圳市」