海量数据

海量数据——TopK问题

为君一笑 提交于 2019-12-08 18:33:45
TopK 问题是一个经典的海量数据处理问题,比如微博热搜每隔10分钟都会更新出排行前10的热门搜索信息,再或者通过大数据找出一个地区最爱吃的水果等,都可以使用TopK问题来解决,其核心思想就是最小堆的引入。 TopK问题分析 在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常被称为TopK问题。 下面我们通过一个简单的例子来说明:假如面试官给你100W个数据,请找出其最大的前K个数,而且现在只有1M的空间? 在32位操作系统中,默认一个字节为4个字节,则有下列运算: NeedSize = 100W * 4 / 1024 /1024 = 4M 计算结果大约等于4M,很显然1M的空间根本不够。也就是说,即使用最复杂的方法你也无法找到一个合适的空间来存储,因此引入了最小堆数据结构。 下面我只说实现的核心思路,对此有不理解的请查看最大堆和最小堆的相关性质。思路如下: (1)定义两个数组,arr用于存储海量数据,top用于存储最小堆(底层可以借助vector) (2)将海量数据的前K个元素先填满top堆 (3)调整top堆为最小堆结构 (4)通过遍历将新数据与堆顶元素(此时堆顶元素是堆里最小的数据)进行比较,大于堆顶就入堆,并向下调整堆结构 (5)遍历结束,则堆中的元素即n个数中最大的前K个 //TopK.h #pragma once #include

海量数据Topk及重复问题

末鹿安然 提交于 2019-12-08 18:33:33
//大数据时代,查找效率最高怎么办,如查询10000个数中最大的100个数; //1.排序中最快的是快速排序,时间复杂度为o(nlogn),将10万个数全排序,不好 //2.局部淘汰,构建容量100的数组,将前100个放入,后面的如果有的数比前一百个最小的大,就替换 //3.分治算法。分为10个组,每组1000个,选出每组的前100个,怎么选:首先快速排序,分为2个堆,如果大堆大于 100,对大堆快速排序,如果大堆小于100(假设93),对小队快速排序,选出7个最大的数。 也就变成在100*10 中排序; //4.Hash法:如果这10000个数重复率很高,可以用hash法,去除重复,再通过分治算法和最小堆法进行排序 //5.最小堆法:可以建1个1000的堆,排好序,后面的依次比较,如果大于最小的就替换,重新排序。 问题: (1)有10000000个记录,这些查询串的重复度比较高,如果除去重复后,不超过3000000个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请统计最热门的10个查询串,要求使用的内存不能超过1GB。 思路:重复率高,可以用hash法去重复,分治算法分为300个堆,每个堆有10000个数,找出前10个,然后把着300*10个数,用最小堆进行筛选,效率可以提高些。 重复问题 在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题

海量数据top K问题

耗尽温柔 提交于 2019-12-08 18:32:55
  在很多的大规模数据处理中,经常会遇到的一类问题就是在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这种问题被称为top K问题,例如在搜索引擎中,统计搜索搜索最热门的10个查询词或者统计下载率中下载最多的东西。   对于top K类 问题一般有两种方法:   1.分治+Trie树   2.hash+小顶堆   举例说明:有1亿个浮点数,如何找出其中最大的10000个?   第一种方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法时间复杂度为O(nlogn),例如快速排序。而在32位机器上,每个float类型占4B,1亿个浮点数就要占用400M的存储空间。而且我们只找出最大的1万个数并不是全部排序所以我们会做很多无用功。   第二种方法局部淘汰法,该方法与排序方法类似,用一个容器保存前1万个树,然后将剩余的所有数字一一和容器内最小的数字比较,如果后续元素比容器内的最小元素大就删掉容器内的最小元素,并将该元素插入容器,最后遍历玩这1亿个数,得到最终结果。   第三种分治法:将1亿个数据分成100份,每份100万个数据,找出每份数据中最大的1万个,最后在剩下的100 X 10000个数据。也就是100万个数据里面找前1万。在这里使用快速排序,将数据分成两堆如果大的那堆个数N大于10000个,继续对大堆快速排序依次

海量数据面试题分析

倾然丶 夕夏残阳落幕 提交于 2019-12-08 18:29:48
https://zhuanlan.zhihu.com/p/40648295 ,转知乎,手敲一遍,加深记忆 箴言:无论是这些海量数据处理面试题也好,还是算法也好,面试时,70~80%的人不是倒在这两方面,而是倒在基础之上(诸如语言,数据库,操作系统,网络协议等等),所以, 无论任何时候,基础最重要,没了基础,便什么都不是 。 何谓海量数据处理? 无非就是基于海量数据上的存储,处理,操作。海量就是数据量太大。导致要么无法再较短时间解决,要么是数据太大,无法一次性装入内存。 解决方案: 针对时间:可以采取巧妙的算法搭配合适的数据结构,如Bloom filter、Hash、bit-map、Heap、数据库索引或者倒排索引、Trie树 针对空间:无非就是大而化小,分而治之(hash映射),不就是规模大嘛,我就化成小的,各个击破。 关于单机和集群问题: 单机:处理装载数据的机器有限(只需考虑CPU,内存,硬盘的数据交互) 集群:机器有多辆,适合分布式处理,并行计算(更多考虑节点和节点间的数据交互) 通过另一篇:Big Data Processing,知道,处理海量数据无非就是: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序 双层桶划分 Bloom filter/Bitmap Trie树/数据库/倒排索引 外排序 分布式处理之Hadoop/Mapreduce 本文第一部分

海量数据处理--从分而治之到Mapreduce

北战南征 提交于 2019-12-08 18:29:10
海量数据处理常用技术概述 如今互联网产生的数据量已经达到PB级别,如何在数据量不断增大的情况下,依然保证快速的检索或者更新数据,是我们面临的问题。 所谓海量数据处理,是指基于海量数据的存储、处理和操作等。因为数据量太大无法在短时间迅速解决,或者不能一次性读入内存中。 在解决海量数据的问题的时候,我们需要什么样的策略和技术,是每一个人都会关心的问题。今天我们就梳理一下在解决大数据问题 的时候需要使用的技术,但是注意这里只是从技术角度进行分析,只是一种思想并不代表业界的技术策略。 常用到的算法策略 分治:多层划分、MapReduce 排序:快速排序、桶排序、堆排序 数据结构:堆、位图、布隆过滤器、倒排索引、二叉树、Trie树、B树,红黑树 Hash映射:hashMap、simhash、局部敏感哈希 海量数据处理--从分而治之到Mapreduce 分治 分治是一种算法思想,主要目的是将一个大问题分成多个小问题进行求解,之后合并结果。我们常用到的有归并排序: 先分成两部分进行排序,之后在合并 , 当然还有其他的很多应用,就比如是我们上篇文章中提到的Top K问题,就是将大文件分成多个小文件进行统计,之后进行合并结果。这里我们对分治进行抽象, 依然从上述提到的Top K频率统计开始出发。定义如下:有M多个Query日志文件记录,要求得到Top K的Query。 我们可以抽象成几个步骤:

MySQL 处理海量数据时的一些优化查询速度方法

坚强是说给别人听的谎言 提交于 2019-12-08 18:18:08
在参与实际项目中,当 MySQL 表的数据量达到百万级时,普通的 SQL 查询效率呈直线下降,而且如果 where 中的查询条件较多时,其查询速度无法容忍。想想可知,假如我们查询淘宝的一个订单详情,如果查询时间高达几十秒,这么高的查询延时,任何用户都会抓狂。因此如何提高 SQL 语句查询效率,显得十分重要。 查询速度慢的原因 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O 吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这是查询慢最常见的问题,是程序设计的缺陷) 8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 9、返回了不必要的行和列 10、查询语句不好,没有优化 30 种 SQL 查询语句的优化方法: 1、应尽量避免在 where 子句中使用 != 或者 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。 2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: 1 select id from t where num is null ; 可以在 num 上设置默认值 0 ,确保表中 num 列没有 null 值,然后这样查询: 1

海量数据处理的几种方法总结

廉价感情. 提交于 2019-12-08 18:17:51
上篇文章罗嗦的讲解了为何要处理海量数据。 除了用数据库和调整硬件和os,软件这里可以做的工作也很多,而且也更加灵活。 其实海量数据处理不外乎以下这思想: 划分->处理->归并(聚集) 当然有的时候根据最终目的不同,有可能处理过程中就可以扔掉很多冗余的数据了,那么经过多层处理也很快。 并行处理也是一种方法,如果划分子集中没有特定的顺序要求,可以并行处理各个子文件,之后再聚集在一起去。 思想就这样了。 有句话是:细节决定成败。 程序的运行 一个方面是要求时间,一方面是要求空间 。 选择合适的算法来解决特定的问题是必要的。 处理的方法有以下几种: Bloom Filter Hash Bit-Map 堆(Heap) 双层桶划分 数据库索引 倒排索引(Inverted Index) 外排序 Trie树 MapReduce 各个方法可以去百科查。 经典的问题是: 1.求top K问题,即数据的条目很庞大,但是有重复的条目,要求统计出出现频率最高的几个条目。 2.查找两堆条目里相同的条目。(或找不重复的条目) 3.要求把一堆条目里重复的条目删除掉,保持唯一性。 4.给一堆数据,判断另一个数据是否在那一堆数据里面。 5.……………… 分析这些问题,不外乎查找和统计。看题目具体要求有没有限制内存大小和时间复杂度,然后套用上述的几种方法。 在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题

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

可紊 提交于 2019-12-08 18:17:34
声明: 原文引用参考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,对每个url根据某种hash规则求取hash(url)/1024

mysql海量数据的优化

試著忘記壹切 提交于 2019-12-08 18:12:46
下面是一部分比较重要的建议: 1、选择正确的存储引擎 以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。 MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。 InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。 2、优化字段的数据类型 记住一个原则,越小的列会越快。对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问。 如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。 3、为搜索字段添加索引 索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索

海量数据处理

冷暖自知 提交于 2019-12-08 18:11:56
常用的几种方法: 1、 分治法/Hash映射 + hash_map a、将海量数据通过Hash映射为若干的小文件; b、利用hash_map对每个小文件进行统计(key为数据内容,value为出现次数); 2、Bloom Filter Bloom Filter是一种允许有少量错误的 数据判重 或者 集合求交集 的方法。 具体内容以及公式参考博客 Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容) a、 建立一个长度为m的位数组+ k个独立的hash函数(若输入的元素个数为n,则错误率为0.01时一般m=13*n,k=8); b、 输入一个元素,经过k个hash函数映射后,将位数组相应位置置1; c、 若一个数据对应的所有位置都为1,则该数据很可能已经出现过,若不全为1,则肯定没有出现过。 缺点: 不能保证结果完全正确;只支持插入和查找,不支持删除; 优点: 节省内存。 改进: CountingBloom Filter 它将标准BloomFilter位数组的每一位扩展为一个小的计数器(Counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。) 3、Bitmap Bitmap是一种和Bloom Filter差不多的概念