海量数据处理策略之一—Hash映射 + Hash_map统计 + 堆/快速/归并排序

时间:2014.05.21

地点:基地

说明:根据July的博客等整理,感谢July的无私奉献

心情:现在都好开心呀,想着要为以后的时光好好奋斗~

---------------------------------------------------------------------------------------

一、问题描述

海量日志数据,提取出某日访问百度次数最多的那个IP。

思路:由于数据集很大,我们的策略是先用哈希映射将海量数据集映射为适当数量的非海量数据集,这个非海量数据集的大小足够我们的计算机吃下。然后我们可用hash_map去对数据进行统计,最后根据统计数据采用堆/快速/归并排序等方式找出最值。

1.在这里步骤一即哈希映射是将海量数据的大文件分割成小文件,因为内存受限,计算机一口吃不下

2.利用hash_map去对划分后的小文件进行频率统计.

3.统计完成后在利用排序算法找出访问频率最大值的IP

具体实现:理论上的2的32次方个IP,我们可以采用哈希映射的方法,比如将IP换成整数去对1000取模,取模的值将会落在集合[0...999]中,每个值对应着一个集合,于是将由1000个集合,我们把取模后得到这个值的IP追加划分到该集合中去。接下来就是对每个小IP集合文件利用hash_map进行频率统计,利用排序算法找出各个文件中的最大值,最后对这些所谓的最大值再找出真正的最大值。

---------------------------------------------------------------------------------------

二、为什么要用哈希映射

   为了能在有限的计算机内存资源下处理海量大数据,我们必须通过某种机制将大文件映射为小文件,这种机制就是散列,他通常将数据均匀地散列到各个子文件中去,这种映射散列的方式叫做哈希函数,好的哈希函数通常还能将数据均匀分布减少冲突。

---------------------------------------------------------------------------------------

三、题目

题目:每一个ip访问百度,其ip地址都会被记录到后台日志文件中,假设一天的访问日志有100G,求出一天中访问百度次数最多的ip地址,可以使用的内存大小是1G。

  首先,我们将文件分解成小文件,题目说可使用大小我们不能就恰恰分成100个文件,因为计算机上还有运行程序或存储其他必要的资源,为了方便计算,我们将数据分成大小为100M一个的文件,这样即分成1024个文件:[FILE 0......FILE1023],100M大小我们说是这么说,但实际上并不会很均匀,一个好的哈希函数会大概将数据均分分配到各个子文件中去。于是这样就解决了因为计算机内存有些而数据海量不能一次性读入计算机的问题。

  然后,我们对小文件中的IP利用hash_map进行统计,求出每个文件中IP出现次数最大的值。

  最后,对这1024个子文件中的IP出现次数最多的再来一轮IP次数出现最多的求法,即可求得整个海量数据下出现次数最多的IP。

你可能感兴趣的:(大公司面试笔试)