问题描述:现有某网站海量日志数据,提取出某日访问该网站次数最多的那个IP。

分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 如果将每个IP地址看做是数组的索引的话,那么需要创建一个unsigned count[N]的数组,即可统计出每个IP的访问次数,但是这个数组的大小是4G*4=16G,
远远超过了32位计算机所支持的内存大小,因此不能直接创建这个数组。

采用划分法解决这个问题,假设允许使用的内存是512M,512M内存可以统计128M个不同的IP地址的访问次数。而4G/128M = 32,所以只要把IP地址划分成32个不同的区间,分别统计出每个区间中访问次数最大的IP,然后就可以计算出所有IP地址中访问次数最大的IP了。

可以把IP地址的最高5位作为区间编号, 剩下的27位作为区间内的值,建立32个临时文件,代表32个区间,把相同区间的IP地址保存到同一的临时文件中。

例如:ip=0x1f4e2342,高5位id=ip>>27=0x11=3,低27位是value=ip&0x07ffffff = 0x074e2342。所以,当扫描到IP为0x1f4e2342时,将value保存在tmp3文件中。

按照上面的方法扫描海量日志,可以得到32个临时文件,每个临时文件中的IP地址的取值范围属于[0-128M),因此可以统计出每个IP地址的访问次数。从而找到访问次数最大的IP地址。

代码如下:

#define  N  32                                                         //临时文件数

#define  ID(x) (x>>27)                                           //x对应的文件编号

#define  VALUE(x) (x&0x07ffffff)                          //x在文件中保存的值

#define  MAKE_IP(x,y)  ((x<<27)|y)            //由文件编号和值得到IP地址.

#define  MEM_SIZE 128*1024*1024

char  * data_path = "D:/test/ip.dat";       //ip数据

//产生n个随机IP地址

void   make_data(const int& n)

//找到访问次数最大的ip地址

int main()

{

make_data(100000000);                                  //产生测试用的IP数据

fstream arr[N];

for (int i=0; i<N; ++i)                                 //创建N个临时文件

{

char tmp_path[128];

sprintf(tmp_path,"D:/test/tmp%d.dat",i);

arr[i].open(tmp_path,ios::trunc|ios::in|ios::out|ios::binary); //打开第i个文件

if( !arr[i])

{

cout<<"openfile"<<i<<"error"<<endl;

}

}

ifstreaminfile(data_path,ios::in|ios::binary);  //读入测试用的IP数据

unsigned data;

while(infile.read((char*)(&data),sizeof(data)))

{

unsigned val=VALUE(data);

int key=ID(data);

arr[key].write((char*)(&val),sizeof(val));           //保存到临时文件件中

}

for(unsigned i=0; i<N; ++i)

{

arr[i].seekg(0);

}

unsigned  max_ip = 0;                    //出现次数最多的ip地址

unsigned  max_times = 0;             //最大只出现的次数

//统计每个数出现的次数

unsigned *count = newunsigned[MEM_SIZE];

for (unsigned i=0; i<N; ++i)

{

memset(count, 0,sizeof(unsigned)*MEM_SIZE);

//统计每个临时文件件中不同数字出现的次数

unsigned data;

while(arr[i].read((char*)(&data),sizeof(unsigned)))

{

++count[data];

}

//找出出现次数最多的IP地址

for(unsigned j=0; j<MEM_SIZE;++j)

{

if(max_times<count[j])

{

max_times = count[j];

max_ip = MAKE_IP(i,j);        //
恢复成原ip地址.

}

}

}

unsigned char *result=(unsigned char *)(&max_ip);

printf("出现次数最多的IP为:%d.%d.%d.%d,共出现%d次", result[0],result[1], result[2], result[3], max_times);

}

(http://blog.csdn.net/v_july_v/article/details/6712171)

14海量日志提取出现次数最多的IP的更多相关文章

  1. 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页

    使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...

  2. 从一亿个ip找出出现次数最多的IP(分治法)

    /* 1,hash散列 2,找到每个块出现次数最多的(默认出现均匀)—–>可以用字典树 3,在每个块出现最多的数据中挑选出最大的为结果 */ 问题一: 怎么在海量数据中找出重复次数最多的一个 算 ...

  3. 利用shell脚本统计文件中出现次数最多的IP

    比如有如下文件test.txt 1  134.102.173.43 2  134.102.173.43 3  134.102.171.42 4  134.102.170.9 要统计出现次数最多的IP可 ...

  4. BAT面试上机题从3亿个ip中找出访问次数最多的IP详解

    我们面临的问题有以下两点:1)数据量太大,无法在短时间内解决:2)内存不够,没办法装下那么多的数据.而对应的办法其实也就是分成1)针对时间,合适的算法+合适的数据结构来提高处理效率:2)针对空间,就是 ...

  5. 从大量的IP访问记录中找到访问次数最多的IP

    1.内存不受限 一个IP有32bit(4Byte),1GB=10亿,那么在4GB内存的情况下,可以存10亿个IP.用HashMap,边存入IP边维护一个最大次数,这样遍历一遍就可以求出,时间复杂度为O ...

  6. 统计Apache或nginx日志里访问次数最多的前十个IP

    1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print $7}' access ...

  7. 统计nginx日志里访问次数最多的前十个IP

    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr -k1 | head -n 10

  8. 查询nginx访问日志中访问次数最多的前10个IP地址

    cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10

  9. 海量日志数据提取某日访问百度次数最多的那个IP的Java实现

    海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...

随机推荐

  1. redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化

    简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMwa ...

  2. 汉诺塔III HDU - 2064

    汉诺塔III HDU - 2064   约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右 ...

  3. netbeans生成的maven工程没有web.xml文件 如何新建

    使用netbeans生成的maven工程没有web.xml 需要自己新建 步骤: 下一步,完成

  4. day36 06-Hibernate抓取策略:set集合上的抓取策略

    你在做查询的时候它可以帮你关联出它的一些相应的关联对象.那么它关联这个对象的时候是在什么时候发送的这些语句以及它是如何把这些数据拿出来的? 知道延迟检索是怎么回事了,而且它也能够产生这个代理对象.当你 ...

  5. NOIP模拟 17.9.28

    公交车[问题描述]市内有

  6. 阿里云MaxCompute 2019-7月刊

    您好,MaxCompute 2019.7月刊为您带来7月产品.技术最新动态,欢迎阅读. 导读 [发布]7月产品重要发布 [资讯]7月重要资讯 [文档]7月重要文档更新推荐 [干货]7月精选技术文章推荐 ...

  7. HR招聘_(十)_招聘方法论(供应商管理)

    招聘和供应商长期合作,所以供应商管理也至关重要.供应商一般分为猎头,渠道,外包三类. 猎头 高端职位,高难度职位,急需职位和量大职位会和猎头公司合作共同完成招聘任务,猎头公司一般会有两种服务,猎头和R ...

  8. SQL Server新增用户并控制访问权限设置。

    新增用户: 一.进入数据库:[安全性]—>[登录名]—>[新建登录名] 二.在常规选项卡中.如图所示,创建登录名.注意设置默认的数据库. 三.在[用户映射]下设置该用户所能访问的数据库.并 ...

  9. 客户端用javascript填充Dropdownlist,服务器端获取不到Dropdownlist的值

    今天遇到一个奇怪的问题,某一页面需要使用三级级联下拉列表框.为提高用户体验,采用jQuery的cascadingDropDown插件调用后台Web Services来实现ajax填充. 填充没有任何问 ...

  10. JavaScript异步

    JavaScript异步类型 延迟类型:setTimeout.setInterval.setImmediate 监听事件:监听new Image加载状态.监听script加载状态.监听iframe加载 ...