海量数据处理

【面试题】海量数据处理相关题目

流过昼夜 提交于 2019-12-08 17:43:50
1. foreword 做腾讯TSA比赛时,遇到海量数据的问题,工作站54G内存,把原始数据读进去各种操作后生成特征,再训练导致崩掉。后来只能把特征做好后存成文件,需要用的时候再读进去,省去了生成的中间环节文件。为了确保内存受得住,把特征按照天来存,最终总算是可以顺利训练和预测了。 内存总是不够的。对于海量数据处理的策略无非是:分解,大化小。除此没啥好办法,除非加内存。但总归需要在软件上下功夫,资源总是有限的。避免浪费。 《九章算法》提供有数十道关于大数据的题目。特此记录。 2. 题目解析 (1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现? 答:前两问其实是一问,top K 分别为1和k。该文件大小为100G,放入内存压力太大,分解为若干小文件,每个小文件则可以在内存中处理。这叫做 hash分桶法 。 将该文件按照 IP 的最后三位分为256个小文件。若均匀则每个小文件大小约为400M,可在内存中直接操作。用公式表述为:file_id = hash(ip) % 1000。 在每个小文件中统计各 IP 的出现次数。可以用IP为key,其出现次数为value统计。取出每个小文件中的top k 的记录。要求次数最多时k=1,前5则k=5。 合并这些小文件

面试题-海量数据处理问题

ⅰ亾dé卋堺 提交于 2019-12-08 17:43:15
参考链接: 教你如何迅速秒杀99%的海量数据处理面试题 类型一 海量数据,出现次数最多or前K 分而治之/Hash映射 + Hash统计 + 堆/快速/归并排序 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 IP有32位,共有 2 32 //--> 个IP。 1)采用hash的方式,ip%m,将大文件分成m个小文件。 2)对每个小文件,用hash表统计ip出现的次数。找出这个小文件出现次数最多的ip 3)在这m个ip中,比较得到出现次数最多的ip。 如果是top k的话,就维护一个长度为k的最小堆。 2、统计最热门的10个查询串,要求使用的内存不能超过1G。 假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。每个查询串的长度为1-255字节。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。 300万*255=7.65x10^8<1GB 1)用hash表统计查询串出现的频率 2)维护长度为k的最小堆 3、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。 10文件顺序读取,然后hash,分散到10个文件里面去。再hash表统计词频,排序。最后归并。 4、给定a、b两个文件,各存放50亿个url,每个url各占64字节

海量数据处理---simhash算法

放肆的年华 提交于 2019-12-06 13:55:31
方法介绍 背景 如果某一天,面试官问你如何设计一个比较两篇文章相似度的算法?可能你会回答几个比较传统点的思路: 一种方案是先将两篇文章分别进行分词,得到一系列特征向量,然后计算特征向量之间的距离(可以计算它们之间的欧氏距离、海明距离或者夹角余弦等等),从而通过距离的大小来判断两篇文章的相似度。 另外一种方案是传统hash,我们考虑为每一个web文档通过hash的方式生成一个指纹(finger print)。 下面,我们来分析下这两种方法。 采取第一种方法,若是只比较两篇文章的相似性还好,但如果是海量数据呢,有着数以百万甚至亿万的网页,要求你计算这些网页的相似度。你还会去计算任意两个网页之间的距离或夹角余弦么?想必你不会了。 而第二种方案中所说的传统加密方式md5,其设计的目的是为了让整个分布尽可能地均匀,但如果输入内容一旦出现哪怕轻微的变化,hash值就会发生很大的变化。 举个例子,我们假设有以下三段文本: the cat sat on the mat the cat sat on a mat we all scream for ice cream 使用传统hash可能会得到如下的结果: irb(main):006:0> p1 = 'the cat sat on the mat' irb(main):007:0> p1.hash => 415542861 irb(main):005

算法之海量数据处理

匿名 (未验证) 提交于 2019-12-02 23:43:01
1.散列分治或MapReduce 这种题目很多,大多都相似一通,针对数据特别多的情况下,一般可以选择MapReduce或者散列分治这两种方式其实思想很相似的只有些许不同;针对数据量不大的情况下可是直接加载进内存来的可以使用Trie树,红黑树这一套,hash表都可以使用。 寻找共同的URL 给定两个a和b文件,各存放50亿个URL,每个URL占64字节,内存限制4GB,请找出a和b文件中共同的URL。 一个文件的内存:5 000 000 000 * 64 = 320GB,每个文件可以分为100个小文件,每个文件大约是3.2GB。 思路一:散列分治,先把a通过hash函数分成100个小文件,在对每个小文件进行词频统计可以使用hash表,Trie树,红黑树这些,再把b也进行统计,在对a和b一起进行词频统计,如果有重复就聚在一块用标识符进行标记即可。 思路二:MapReduce,先对a进行MapReduce在对b进行MapReduce,然后再对a和b统计出来的结果在进行MapReduce即可。 思路三:Bloomfilter过滤器,把4GB建立一个位数组,然后把a文件映射上去,在从b文件里面查重。 ps:MapReduce先把文件直接分成M个块这样就生成了M个Map任务,Map进行URL的映射变为字典,在通过HashShuffe对每个Map任务进行分区,然后在merge

海量数据处理之数据库索引

时间秒杀一切 提交于 2019-11-26 21:50:21
前言:本文第一部分讨论数据库的索引及其优化,主要以sql server为例,第二部分我们从Mysql讨论它背后的数据结构和算法原理。 第一部分,数据库索引及其优化 一,什么是索引   数据库索引好比是一本书前面的目录,能加快数据库的查询速度。   例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。   索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;显然在一个基本表上最多只能建立一个聚簇索引。建立聚簇索引后,更新该索引列上的数据时,往往导致表中记录的物理顺序的变更,代价较大,因此对于经常更新得列不宜建立聚簇索引,聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。建立一个聚簇索引如: create cluster index id on Student(id); 二,概述   建立索引的目的是加快对表中记录的查找或排序。   为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 精简来说

海量数据处理方案

五迷三道 提交于 2019-11-26 07:40:34
什么是海量数据? 正如《逍遥游》中的一句话:北冥有鱼,其名为鲲,鲲之大,一锅炖不下,化而为鸟,其名为鹏,鹏之大,需要两个烧烤架;简单的可以把这里的海量数据理解为这里的鲲鹏 ,数据大到一个服务器存不下,就需要两个甚至多个服务器来存储。而接下来我们需要做的就是用一台服务器来处理海量数据。 以下是一些海量数据处理的例子: 1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 思路:显然100G大小的文件是不可能直接加载到内存中去处理的。所以我们需要对这个文件进行划分,前提是我们需要将相同的IP地址划分到同一空间。假设我们将文件分成1000份,那么一份的大小大概是100M,先将IP地址利用哈希算法求得一个整数key,再将index = key % 1000,得到的结果相同的放到同一文件中,这样就将相同的IP地址放到了同一个文件下。再对每一个文件分别进行处理,用count来记录出现的次数,最后利用排序算法对count进行排序找到最大的那个,即其对应的IP地址为出现次数最多的IP地址。 利用这种方法解决这个问题的关键在于我们在用哈希函数进行哈希切分后相同的IP地址一定会被分到同一个文件中。对于哈希切分,相同的key,得到的哈希值一定相同。 2.给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).

海量数据处理题目小结

做~自己de王妃 提交于 2019-11-26 07:38:46
解决这类题目的思路一般为 (1)能否用特殊的数据结构解决:位图,布隆,堆。 (2)哈希切分 1。给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址 思路分析: 1.要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中, 2.这里我们使用效率很快的哈希表,进行此数的统计,就可以找出出现此数最多的IP地址 2.与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现? 思路分析: 要找到topK的IP地址,如果直接进行排序的话,内存放不下,而且效率太慢,所以这我们可以建一个K大小的堆,这里建小堆比较好,因为来一个数和进行堆顶的元素进行比较,然后进行向下调整,大的就下去了,因此最终统计的就是topK 3。给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确 算法和近似算法! 思路分析: 1。文件进行比较,用位图显然不能解决 2。肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理

海量数据处理-Topk引发的思考

霸气de小男生 提交于 2019-11-26 07:38:34
海量数据处理–TopK引发的思考 三问海量数据处理: 什么是海量数据处理,为什么出现这种需求? 如何进行海量数据处理,常用的方法和技术有什么? 如今分布式框架已经很成熟了,为什么还用学习海量数据处理的技术? 什么是海量数据处理,为什么出现这种需求? 如今互联网产生的数据量已经达到PB级别,如何在数据量不断增大的情况下,依然保证快速的检索或者更新数据,是我们面临的问题。所谓海量数据处理,是指基于海量数据的存储、处理和操作等。因为数据量太大无法在短时间迅速解决,或者不能一次性读入内存中。 从何解决我们上面提到的两个问题:时间问题和空间问题 时间角度,我们需要设计巧妙的算法配合合适的数据结构来解决;例如常用到的数据结构:哈希、位图、堆、数据库(B树),红黑树、倒排索引、Trie树等。空间角度:我们只需要分而治之即可,两大步操作:分治、合并。MapReduce就是基于这个原理。 如今分布式框架已经很成熟了,为什么还用学习海量数据处理的技术? 这个问题,就相当于为什么要学习算法,因为大部分人在工作中都很少用到这些算法和高级的数据机构。武侠讲究内外兼修才是集大成着。算法就是内功,可以不用,不可以没有。算法更多的是理解和推到的过程,这就是为什么很多学数学和物理专业的学生,可以在计算机行业做的很好,因为他们的数学好,可以很好的理解各种推到过程和算法原理。最后一句话,知其然而后知其所以然

海量数据处理学习

五迷三道 提交于 2019-11-26 07:37:48
海量数据处理介绍 所谓海量数据,其实就是数据量比较大处理起来不大方便。举个简单的例子,中国人口13亿,如果需要对这么多人进行出生时间,籍贯,家庭住址等进行存储查找。另外一个例子就是,搜索关键字的排名等。这些问题面临的最大问题就是数据量很大。 海量数据处理主要从时间和空间两个维度来考虑。 * 时间角度: 为了存储数据,必须能够很快的找到空闲空间进行存储;为了查找分析数据,必须能够很快的找到对应的存储空间。也就是说时间复杂度必须足够小。通常必须为 O ( a ∗ l o g N ) //--> 。 * 空间角度:数据量比较大的时候,分而治之,大而化小是唯一的选择之道。因为当数据量比较大时,是不可能将全部数据装载到内存里的,更多的情况是大而化小后,存储在硬盘存储器中。每次只处理一个小文件/小数据。各个击破。 海量数据处理方法 分而治之/Hash映射+Hash统计 + 堆/快速/归并排序 双层桶划分 Bloom filter/Bitmap Trie树/数据库/倒排索引 外排序(Merge sort) 分布式处理之hadoop/mapreduce 海量数据例子和应用 方法一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序 海量日志数据,比如某天访问某网站最多次的IP地址 (1). 分而治之/Hash映射。内存的大小是有限的

海量数据处理技巧

戏子无情 提交于 2019-11-26 07:37:12
数据时代来临,数据量的爆炸式增长是最为显著的特征。当高性能硬件的普及还跟不上这样的数据大潮时,如何在有限的时空资源内处理海量数据成为了计算机科学以及数理统计等领域最大的挑战。 所谓“数据处理”,在本文中特指通过计算机技术,对海量数据进行存储、统计、查询等操作。我将在下面介绍一些基本的海量数据处理的方法,供大家参考。需要明确的一点是,现实情况复杂多变,所以对于海量数据处理这样大的主题,是不可能用一篇博客就说清楚的。但方法论可以一通百通,我们通过一些已经被无数次实验证明有效的方法,就能大致理解对此类问题的解决思路,之后在面临新的问题时,至少能找到一个大致的方向。 1. 海量数据处理的困难 海量数据处理的困难用一句话概括,就是时空资源不够。具体来说, 时间受限:无法在有限时间内,完成针对海量数据的某项处理工作; 空间受限:无法将海量数据一次性读入内存 对于时间受限的问题,我们一般的解决办法是高效的算法配合恰当的数据结构,比如哈希表,Bloom Filter,堆,倒排索引,tire树);而对于空间受限的问题,一般的解决办法是“大而化小,分而治之”的策略,既然一次性行不通,那就一部分一部分读,每读入一部分可以生成一个小文件,小文件是可以直接读入内存的,我们这样分割大数据之后,再依次处理小文件的数据。 注意,本文我只介绍对于海量数据执行一些简单的数据处理(比如存储,查重,排序,统计数量等