哈希

Perl常用模块 (Data::Dumper)

旧街凉风 提交于 2019-12-09 20:38:33
为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USA Frankfurt, Germany Berlin, Germany Washington, USA Helsinki, Finland New York, USA 我们想要按国家将城市分类,每个国家后面对应城市列表,如果用perl4来做,必须将城市列表组合成字符串才行,如果用perl5就可以用引用来做,有了引用,就可以构造复杂的hash结构,就可以用列表作为hash的值了。 如何定义引用? 1、 定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用,比如 # 数组的引用 my@array= (1,2,3) ; my$aref=\@array ; #哈希的引用 my%hash= ("name"=>"zdd","age"=>30,"gender"=>"male") ; my$href=\%hash ; #标量的引用 my$scalar=1 ; my$sref=\$scalar 2、匿名引用 方法一不是很常用,最常用的还是匿名引用,方法如下 匿名数组引用-用[]定义 $aref= [ 1,"foo",undef,13 ]; 匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组

Nginx、HAProxy、LVS三者的优缺点

三世轮回 提交于 2019-12-09 16:00:46
一、Nginx优点: 1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。 2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能。 3、Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。 4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS小。 5、Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。 6、不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。LNMP也是近些年非常流行的Web架构,在高流量环境中稳定性也很好。 7、可作为中层反向代理使用。 8、可作为静态网页和图片服务器。 9、Nginx社区活跃,第三方模块非常多,相关的资料在网上比比皆是。 Nginx常规的和HTTP请求和相应流程图: Nginx缺点: 1、适应范围较小,仅能支持http、https、Email协议。 2、对后端服务器的健康检查,只支持通过端口检测,不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了

海量数据处理问题分析

喜欢而已 提交于 2019-12-08 19:20:56
哈希切割top K问题 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 将 100 G的 log file 哈希切分成 1000 份,为什么不切成 100 份 因为 100 份中不一定每个文件大小都是 1 G,有的文件可能要 5 , 6 个G的,因为有哈希冲突,可能某个文件哈希冲突多 文件大小要 10 G左右了,因此哈希切分成 1000 份,每份 100 M 这样最多IP大小也就 1 到 2 个G,哈希表可以进行处理。 切分时:先把IP字符串转为整型,再取模Ip %1000 进行哈希切分存储。因为相同的IP一定会进入同一个文件 然后 1000 份中用哈希表KV模型进行统计每个IP的次数 用第一个文件中IP次数和第二个最多IP次数比较,大的保留 小的销毁,依次向后比较,直到统计完 1000 份中最大的IP次数。 如果某一个文件IP值过多,导致文件过大,可以用不同的哈希 算法进行切分来实现分流。 位图应用 给定100亿个整数,设计算法找到只出现一次的整数 要知道 100 亿个整数占多少空间, 10 亿个整数大概占一个G 100 亿大概占 10 个G,但是一百亿个整数,所以要大概占 40 个G 很明显内存中是存不下的,位图只需要用位来表示一个数在或者 不在,一个字节为 8 个比特,现在用 32 个比特位表示,则 40 G

海量数据分析问题总结

大兔子大兔子 提交于 2019-12-08 19:11:38
1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。 2)与上题条件相同,如何找到top K的IP?如何直接⽤Linux系统命令实现? 这一道题的思路就是我们从题意可以看到这道题是来找top K的IP,topK我们的思路就是用堆来实现,找Top,就需要用小堆,这个是根据对的数据特性,我们建立成小堆,然后每次和堆顶最小的进行比较,然后再次进行向上调整,最后,就可以得到一个堆顶是最小IP,的一个小堆,这个小堆就是我们需求的K个IP,需要建的是K个节点的堆。 3)给定100亿个整数,设计算法找到只出现⼀次的整数! 由于是整数,所以我们采取的思路就是我们可以采用位图,100亿个整数,大致就是需要1.25G的内存进行存储。一个数字必须要2个位来进行表示状态,比如说,00表示不存在,01表示存在一次,10表示存在多次。这样就可以全部表示出每一个数存在的状态,这里我们就需要的内存是2.5G。 4)给两个⽂件,分别有100亿个整数,我们只有1G内存,如何找到两个

海量数据处理

两盒软妹~` 提交于 2019-12-08 18:58:11
1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 初步分析: 100G普通机器内存中肯定是放不下的,目前使用的IP地址相当于一个32位的字符串,所以我们考虑切分,假设有1G可用内存我们切分为100份,那我们需要把这100个文件全部遍历,每一次出现的IP地址进行统计,最后找出出现次数最多的IP地址,此办法可行但是效率不高。 优化: 把这32位的IP地址通过字符串哈希函数转化为对应的整形,模除1000后将文件分为1000份:从硬盘中读取这些IP,转化为整形后对文件个数取余,余数是多少就放进哪个文件,这样就保证了同一个ip地址在同一个文件里。这种方法叫做哈希分桶法(不均匀)。分好之后去统计每个文件里出现次数最多的IP地址,再转化为找1000个IP出现次数最多的一个。 2)与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现? 初步分析:继上题可能很容易想到找出每个文件中出现次数最多的,在它们中再找出topK个,可是你怎么能保证一个文件中出现最多的次数就一定比另一个文件中出现最少的次数大。所以这种思路有问题。 优化:首先和第一题一样,先采用哈希分桶分好1000个文件,然后找出每个文件的Topk(在这里用优先级队列或者建小堆都可以),最后Topk进行汇总。 3)给定100亿个整数,设计算法找到只出现一次的整数!

常见海量数据处理问题的解决思路

我是研究僧i 提交于 2019-12-08 18:57:16
基本思路 哈希分片。计算每个数据的哈希码,再进行求模运算,这样相同的数据将进入相同的分片。 字典树/哈希表。对每个分片,统计数据出现的次数。 堆。利用堆求topK问题。 归并。由于每个分片之间不存在重复数据,归并过程就很简单。 常见题目 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?   分别对a、b两个文件进行哈希分片,方法是hash(s)%1000,这样将得到2000个文件,分别是a0,a1,...a999,b0,b1,...b999。分别对ai和bj进行处理,方法是将ai中的数据放入哈希表中,然后判断bj中的数据是否出现在该哈希表中,如果是,那么它就是公共数据。 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。   利用2比特的BitMap。00表示不存在,01表示出现一次,11表示出现多次,依次将2.5亿个数放入BitMap中,需要的内存大约是2^32*2bit=1GB。 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?   利用哈希分片,将1000万字符串分为100个小文件,然后对每个小文件去重,方法是利用字典树。最后将这100个结果合并起来。 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行

海量数据处理~

删除回忆录丶 提交于 2019-12-08 18:44:39
海量数据,意思就是数据数量大,一般来说呢,就可以考虑哈希算法~ 那么,哈希算法是什么嘞?它也叫做散列函数,顾名思义,把一组数据散列开,常用的方法就是模值取余法,例如,一组数据{0,1,2,3,4,5,6,7},可以散列成两组,模2得0的和模2得1的{0,2,4,6},{1,3,5,7}; OK,言归正传,说海量数据的事~ 一、经典思路: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序 举个例子叭~ 例1 、海量日志数据,提取出某日访问百度次数最多的那个 IP 。 简单粗暴的方案1:众所周知,IP是32位的,那也就是说,IP一共会有2^32种情况,直接分配一个2^32的内存,然后进行模上2^32,再进行哈希统计。 心思缜密的方案2: 很多问题都可以套路方案2呢,总之记住一点,分组一定得保证相同的在一个组里,不然没办法统计。还有一个小点,如果不是整型,而是字符串呢,总不好直接模整型吧,解决办法: (1)字符串的ASCII值相加。 例如呢, "abc" = 97 + 98+ 99; (2)字符串的ASCII值乘以系数相加,例如呢, "abc" = 97*( 2^2 )+ 98*(2^1)+ 99*(2^0); 例2: 给定 a 、 b 两个文件,各存放 50 亿个 url ,每个 url 各占 64 字节,内存限制是 4G ,让你找出 a 、 b 文件共同的 url ?

大数据处理题型分析

一笑奈何 提交于 2019-12-08 18:42:13
大数据处理,顾名思义,数据量非常大,有些可以一次处理,有些需要分割后对其进行处理。解决这类题型的第一点就是要算出其所需空间的大小; 1.给定100亿个整数,设计算法找到只出现一次的整数; 解题思路:有100亿个整数,一个整数4字节,共所占空间:100亿*4字节 = 10G*4 = 40G;所有整数的范围为0到42亿9千万; 需要找到只出现一次的整数,那么我们就可以直接断定一个数出现的状态就有三个-------->没有出现,出现1次,出现1次以上。三种状态用两个二进制位足以表示; 使用位图的变形就可完成这个题的解答(由原来位图的1个位表示一个数,变形为2个位表示一个数); 40亿左右的整数,一个数用两个位表示,所占大约1G的空间; 2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 对与两个大文件中比较的处理,首先要考虑的是内存中是否能放的下这个文件,如果放不下就需要切分,如何切分是个重要的问题,一种是等分,一种是哈希切分,怎么切要视情况而定。针对本次等分显然是有大的问题,比如说,相同数据不在一个块中;所以需要的是哈希切分;什么是哈希切分,如果不知道,就去看看上一篇博客把;哈希切分之后,相同的数肯定是进入了同一个小文件。 3.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数? 100亿个int,占约40G的空间

海量数据处理方法及应用

[亡魂溺海] 提交于 2019-12-08 18:22:06
一、哈希切割top K问题 1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? (1)首先使用散列函数HashFunc(ip)将每一个IP地址转化为整型,再通过HashFunc(ip)%1000使得每一个IP各自进入到所切分的1000个小文件中,余数是多少就映射到多少号文件中,这样做能保证相同IP进入到同一文件中; (2)接着在每一个小文件中建立Key-Value模型的哈希表,各自统计出Value(出现次数)最大的IP; (3)最后依次比较这1000个小文件中出现次数最多的IP,找到最终出现次数最多的IP地址。 2. 与上题条件相同,如何找到top K的IP? 先对第一个小文件的数据建立小堆(大小为K),存入出现次数最多的前K个IP,再依次读入每一个文件,将每一个IP的出现次数与堆中IP次数比较,如果大于堆顶的IP,则替换堆顶,并更新堆,依次执行下去,直到1000个文件全部读完,整个堆的数据即为出现次数最多的前K个IP。 二、位图应用 1. 给定100亿个整数,设计算法找到只出现一次的整数 所有整数的范围是从0到42亿9千万,每个整型占用4字节,这样存放这些整数至少需要16G的内存空间,太耗费空间了,如果用位图的思想来解决这个问题,就可以大幅度节省空间。 在该题中需要注意的是要统计次数

Python程序员面试算法宝典---解题总结: 第9章 大数据 9.1 如何从大量的url中找出相同的url

淺唱寂寞╮ 提交于 2019-12-08 17:47:27
# -*- coding: utf-8 -*- ''' Python程序员面试算法宝典---解题总结: 第9章 大数据 9.1 如何从大量的url中找出相同的url 题目: 给定a,b两个文件,各存放50亿个url,每个url各占64B,内存限制是4GB,请找出a、b两个文件 共同的url。 分析: 海量数据处理方法有: hash(字典),位图,布隆过滤器,倒排索引,数据库优化,外部排序,Trie数,堆, 双层桶,MapReduce。 重点: 哈希,位图,Trie树,堆。 50亿个url占据=50亿*64B = 50 0000 0000 * 64 B = 3200 0000 0000 = 3200 00000 KB = 320000 MB = 320GB 实际只有4GB,显然不能将所有数据全部放入内存。 4GB可以存放=4GB/64B = 4 * 2^30 / 2^6 = 2^5 M = 32* 2^20个url。 考虑用分治法,计算每个url的哈希值,将哈希值相同的url存入同一个文件中。 为了能让内存中可以放得下,可以考虑平均每个文件大约600MB, 这样a,b中相同哈希值划分得到的文件总共内存大约1.2GB,然后寻找这两者共同url 最多1.2GB,这样可以控制整个内存占用最多不超过2.4GB。 关键: 1 书上解法 步骤1: 计算每个url的哈希值hash,然后用 hash