海量数据问题处理

阅读:http://blog.csdn.net/v_july_v/article/details/7382693

  

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

  对于该问题文字只是大概给了思路,接下来则是本人进一步思考结果:

  具体而论,则是: “首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方 法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map对那1000个文件中的所有 IP进行频率统计,然后依次找出各个文件中频率最大的那个IP)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所 求。”-

  本题并没有对硬件环境进行要求,因此映射的方法为mod1000,如果有内存要求,则相应要进行修改。

  在映射完之后,硬盘上将有大量的IP,这时以IP为键,IP频率为值进行hash map,考虑到IP可能会有多个,解决办法是,建立1000个数的数组,然后一边操作一边把频率最大值放在相应的数组里,求数组的最大值,然后在拥有最大值相应的文本里通过最大频率来找相应的IP值。

 


 

 

2、寻找热门查询,300万个查询字符串中统计最热门的10个查询

    原题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

  本题对硬件进行了要求:只有1G内存,即1024*1024*1024字节。

  虽有一千万个记录导致无法一次性全部读入,但是去掉重复的只有三百万个,300,0000*255 < 1024*1024*1024,那么我们可以一个个的读取记录,然后用键(查询串)值(频率)对来记录,最后用堆排序,初始化一次,推调整9次就能统计到10个热门查询。

 


 

 

  

 

 

posted @ 2013-10-23 11:17  yutoulck  阅读(182)  评论(0编辑  收藏  举报