海量数据处理问题

 海量数据处理算是我目前接触到的十分实用的问题,现在的软件后台等都会处理大量的数据,虽然我现在接触的都是十分简单十分基础的题目,但是这给了以后的问题处理提供了很好的一个思路。前几天用堆进行了海量数据的TopK问题今天给大家介绍一些其他的问题。

  最近,了解了哈希了哈希的一些扩展,哈希学到的是一种思路,所以将这种思路进行改进进行就有了位图,还有布隆过滤器等等。

1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 

海量数据处理的时候,和少量的时候比,已经不能将你的所有数据都在内存中进行计算了, 所以当你看到这个题已经不是说,之前所做的效率问题,因为之前有很多数据处理的时候会考虑处理方法,因为比如我们用暴力不断的循环来寻找,是效率十分低的问题,但是现在即使你不考虑效率是不是低,你都是不能进行运算的,因为你根本不能同时读取这么多数据,所以现在应该怎么办?有人想到了等分,将你的文件通过切割成小份来进行运算,然后将你的小份数据进行运算,但是你想,假如你的100G,你分成了100分,第一份中最多的是A第二多的是Z,第二份中最多的是B第二多的是Z,依次到最后,你的Z每次都是第二多的,但是最终你加起来最多的应该是Z,你这时候怎么办呢?所以这个思路虽然确实可以解决问题,但是是存在一定的缺陷的,所以需要对你当前的方法进行一定的改进。既然学了哈希,这里的问题一定是和哈希是有一定的联系的,所以是一定要向哈希方向思考。这里其实说到哈希划分就很容易想到了,这里划分的方式不是随机划分,不是平均划分,而是通过哈希某种划分的,为什么说某种呢?因为这可以有多种划分方式,不过是划分方式好坏,能不能分的相对平均罢了,但是无论你是哪种划分方式是不是相同的ip都划分到了同一个文件里边,这就保证了,虽然将你的ip进行了小划分,但是在划分的同时又保证你的相同的ip划分到了同一个文件之中。这时候你就可以读取每一个小文件读取到内存中,进行数据分析统计。

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

这里首先介绍一下位图,位图就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

   既然叫位图,那就是说明这里的数据结构是通过位来进行操作的,大家都知道计算机中按位来存储的数据,只有两种状态,因为计算机中也只有0101这些数据,所以这里的位也只有0101两种数据,所以既然每一位表示一个数据,那就只能是,这个数据只能有两种状态,所以这里经常判断这个数据是不是存在。这里将你的每个数据映射到对应的位置之后,如果出现了就将他对应的位置的位变成1。这里之后我会有具体的代码向大家展示怎么实现。再返回到这个题之后,位图只能表示存在不存在,那你这里应该怎么办呢?因为是100亿个数据,这有位图这样的数据结构才可能会实现,对他的操作,这里顺便说一下,100亿个数有多大呢?1G大约是10亿个字节,一个int类型是4个字节,1G大约是能有2.5亿个int数字,100亿那就需要40G,这显然是很难通过单机内存来实现的。但是用位图是多大呢?一个数字占一个位,1G10亿个字节,1个字节是8个比特位。所以1G也就是80亿个位,100亿也就需要2G就能来实现,这显然是很大的数量级的差距。

  但是这里说了,是只存在一次的,这是包括三种情况,第一种不存在,第二种存在一次,第三种存在多次,这时候应该怎么办,怎么来处理。这里既然说到了位图,那一定也是在位图的基础上进行更改的。

  这里最初我们占了一个位,来记录每一个数据,如果我们这里用两个比特位来表示一个数据呢?这里就可以表示多种情况了。他有00011011,这四种情况,你想用哪个来表示只出现一次你就用哪个来表示只出现一次,然后用剩下的去表示别的就可以,但是我们通常来时是用01来表示出现一次,这样代码的可读性,操作性都很好。这就是对位图的一些扩展。

  之前写了一些哈希和位图一些代码,但是都还没有整理好,尤其哈希在扩展方便还有一些小问题,等整理好了之后会发出来。

猜你喜欢

转载自blog.csdn.net/hanani_jia/article/details/80358566