海量数据处理

海量数据处理学习笔记

南笙酒味 提交于 2019-12-08 18:03:54
一:数据处理常见方法:hash方法、bit-map法(位图)、bloom filter(布隆过滤器)、数据库优化法、倒排序索引法、外排序索引法、tire树、堆、双层桶排序、mapreduce。 二:hash法 hash一般称为散列,是一种映射关系。构建散列表需要设定一个散列函数,加油设定一个冲突处理方法。冲突处理主要有:开放地址法(当地址发生冲突时,按照固定函数在散列,知道找到空闲位置)链地址法(设置指针组ch【m】,所有散列地址为i的数据元素都插入到头指针为策划ch【i】的链表中)再散列法(在散列冲突使用第二个、第三个。。。直到无冲突)建立公共溢出区。 hash主要是用来进行“快速存取”,在o(1)的时间复杂里,可以查找到元素,或者判断元素是否存在。 三、bit-map法 例题:从八位号码中找出重复号码,或删除重复号码。8位数字最多可以表示99999999个号码,每存储一个号码占用一个bit位,则需要99mbit,12.75MB就可以存储。例如,00000123的号码,把第123位置为1,当位为1时输出改位当前下标,则得出改信息。 三:blooom filter法 bloom filter的基本思想是位数组和hash函数的联合使用。包涵一个m位的位数组,初始化为0,定义k个不同的hash函数,每个函数为映射到一位。置为1,查询某元素是否存在时,检测该k个位是否全部为1。特点

海量数据处理 (一)

大城市里の小女人 提交于 2019-12-08 17:59:41
现有海量日志数据保存在一个超级大的文件中,该文件无法直接读入内存,要求从中提取某天出访问百度次数最多的那个IP。 从这一天的日志数据中把访问百度的IP取出来,逐个写入到一个大文件中; 注意到IP是32位的,最多有2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件; 找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率; 在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 2. 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url? 假如每个url大小为10bytes,那么可以估计每个文件的大小为50G×64=320G,远远大于内存限制的4G,所以不可能将其完全加载到内存中处理,可以采用分治的思想来解决。 遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999,每个小文件约300M); 遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,…,b999); 这样处理后,所有可能相同的url都被保存在对应的小文件(a0vsb0,a1vsb1,…,a999vsb999)中,不对应的小文件不可能有相同的url

【大数据】海量数据处理方法

不问归期 提交于 2019-12-08 17:58:33
  1、海量日志数据,提取出某日访问百度次数最多的那个IP。     首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。   或者如下阐述(雪域之鹰):   算法思想:分而治之+Hash   1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;   2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;   3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;   4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;     2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。   假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万

海量数据处理实例

醉酒当歌 提交于 2019-12-08 17:55:18
在bat等大公司,基本所有业务的数据量级都很庞大,那么如何在保证数据完整性的情况下快速处理成了一个通用的难题,这里列举几个例子,大致反应一些处理思想。 1.一个文件中,每一行有一个整数,有上亿行,目的:统计出现次数超过三次的整数写入到另一个文件中。 分析: (1)首先数据在文件中,既然要统计,那么有一个原则就是减少IO次数。 (2)其次数据量上亿,内存中肯定不可能全放下。 (3)需要统计次数,那么就需要知道每个整数的出现次数。 问题:既然内存中放不下每一个数据,那么就没办法知道当前拿到的数据出现了几次,也就不知道应不应该把它写入到目标文件中去。 思考:上亿的数据无法存放在内存中,我们先缩小数据量级,100w的数据是可以放在内存中的,那么我们是不是可以把上亿的数据分成100份100w的数据分开处理呢。 解决思路:先轮询一遍整个文件,对数据进行分片,分片规则:0<= num <100w放一个文件,100w<= num <200w放一个文件,依此类推。那么现在就会分为多个小文件了,我们就可以一个一个处理了,总的会进行2次IO,时间复杂度就是2n了。(PS:分治的方法,需要遍历两次,也可以使用位图,值需要遍历一次,但位图有限制,只能缩小32倍,2G内存最多可存放2^34个整数对应的位) 2.海量日志数据,提取出某日访问网站次数最多的IP 分析: (1)日志数据极其庞大

海量数据处理

痞子三分冷 提交于 2019-12-08 17:54:20
有20亿个数,给定内存大小为1G,求中位数 首先求中位数,其实就是求topK,比如此题就是求top 20G/2( 1亿个int占用512M内存,10亿个字节占1G内存,要记住 )。 如果内存能存下这么多数,直接用一个大小为20G/2的堆就可以。另外求topK时,有个窍门:求最大topK,先建一个最小堆,然后所有大于根节点的值,替换根节点并调平衡;求最小topK,先建一个最大堆,然后将比根节点小的值插入堆。 此题内存存不下这么多数,可以这么做: 先建一个最大堆,大小为1G(内存大小),先求出第1G大的数(即堆的根节点),然后再以此值作为堆的根节点建堆,求出第2G大的数,依次类推,直到求出第5G大的数即为所求。每次建堆并求最大值的时间复杂度为nlogk,一共需要建5次堆。 处理海量数据思路 1.分而治之/hash映射 + hashmap/trie统计 + 堆排序 + 归并 2.bitmap/bloom filter 3.多层划分 例题 1.海量日志数据,提取出某日访问百度次数最多的那个IP 2.寻找热门查询,300万个查询字符串中统计最热门的10个查询 3.有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词 4. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10 5.给定a、b两个文件

大数据——海量数据处理的基本方法总结

时间秒杀一切 提交于 2019-12-08 17:50:28
原文地址为: 大数据——海量数据处理的基本方法总结 声明: 原文引用参考July大神的csdn博客文章 => 海量处理面试题 海量数据处理概述 所谓海量数据处理,就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。本文在前人的基础上总结一下解决此类问题的办法。那么有什么解决办法呢? 时间复杂度方面,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。空间复杂度方面,分而治之/hash映射。 海量数据处理的基本方法总结起来分为以下几种: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 前提基础知识: 1 byte= 8 bit。 int整形一般为4 bytes 共32位bit。 2^32=4G。 1G=2^30=10.7亿。 1 分而治之+hash映射+快速/归并/堆排序 问题1 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 分析 :50亿*64=320G大小空间。 算法思想1 :hash 分解+ 分而治之 + 归并 遍历文件a

面试经典的海量数据处理(TOPK)问题—转载+个人见解!

不想你离开。 提交于 2019-12-08 17:48:35
常见问题: ① Top K问题 : 分治+Trie树/Hash_map+小顶堆 。采用Hash(x)%M将原文件分割成小文件,如果小文件太大则继续Hash分割,直至可以放入内存。 ② 重复问题 : BitMap位图 或 Bloom Filter布隆过滤器 或 Hash_set集合 。每个元素对应一个bit处理。 ③ 排序问题 : 外排序 或 BitMap位图 。分割文件+文件内排序+文件之间归并。 Top K问题: 1. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 ①分治:顺序读文件,对每个词x取Hash(x)%2000,按照该值存到2000个小文件中。每个文件是500k左右。如果有文件超过了1M则继续分割。O(N) ②Trie树/Hash_map:字符串用Trie树最好。对每个小文件,统计其中出现的词频。 O(N)*(平均字符长度),长度一般是常数,也就是O(N). ③小顶堆:用容量为100的小顶堆,以频率为value值插入,取每个文件现频率最大的100个词,把这100个词及相应的频率存入文件。最差O(N)*lg(100),也就是O(N). 注:2,3步骤合起来需要一轮磁盘存取过程。存入文件的个数可以缩减一下,因为主要开销在磁盘读取上,减少文件读取次数,可以在每个文件存取最大容量的字符数量,比如这道题1*(

海量数据处理(面试)

北战南征 提交于 2019-12-08 17:47:43
题目: 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 假设有一个大文件,里面以字符形式存储了IP与IP访问次数,这两数据按空格隔开,然后一行对应一个IP。 解决思路 算法思想:分而治之+Hash 1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址; 4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP; 解决过程中的问题: (1)我的是FAT16文件系统,一个根目录下文件数量有限制,只能存放512个文件,我在批量创建的时候因为限制只有509个,所以我就按照509开始分文件 (2) 批量打开文件的函数 应当注意的是在写文件描述符关闭后才可以打开读的 void openFileOut(ofstream * out ) { for ( int i = 0 ; i < 509 ; ++i) { char path[ 100 ] = "D:\\VS2015\\代码\\C++file\\C++file\\文件\\" ;

海量数据处理面试题集锦与Bit-map详解

你离开我真会死。 提交于 2019-12-08 17:44:58
十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July。 前言 本博客内曾经整理过有关海量数据处理的10道面试题( 十道海量数据处理面试题与十个方法大总结 ),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时, 程序员编程艺术系列 将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。 第一部分、十五道海量数据处理面试题 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

海量数据处理面试题集锦

安稳与你 提交于 2019-12-08 17:44:28
十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July。 前言 本博客内曾经整理过有关海量数据处理的10道面试题( 十道海量数据处理面试题与十个方法大总结 ),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时, 程序员编程艺术系列 将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。 第一部分、十五道海量数据处理面试题 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。