14海量日志提取出现次数最多的IP
问题描述:现有某网站海量日志数据,提取出某日访问该网站次数最多的那个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的更多相关文章
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
- 从一亿个ip找出出现次数最多的IP(分治法)
/* 1,hash散列 2,找到每个块出现次数最多的(默认出现均匀)—–>可以用字典树 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可 ...
- BAT面试上机题从3亿个ip中找出访问次数最多的IP详解
我们面临的问题有以下两点:1)数据量太大,无法在短时间内解决:2)内存不够,没办法装下那么多的数据.而对应的办法其实也就是分成1)针对时间,合适的算法+合适的数据结构来提高处理效率:2)针对空间,就是 ...
- 从大量的IP访问记录中找到访问次数最多的IP
1.内存不受限 一个IP有32bit(4Byte),1GB=10亿,那么在4GB内存的情况下,可以存10亿个IP.用HashMap,边存入IP边维护一个最大次数,这样遍历一遍就可以求出,时间复杂度为O ...
- 统计Apache或nginx日志里访问次数最多的前十个IP
1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print $7}' access ...
- 统计nginx日志里访问次数最多的前十个IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr -k1 | head -n 10
- 查询nginx访问日志中访问次数最多的前10个IP地址
cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10
- 海量日志数据提取某日访问百度次数最多的那个IP的Java实现
海量日志数据提取某日访问百度次数最多的那个IP的Java实现 前几天在网上看到july的一篇文章<教你如何迅速秒杀掉:99%的海量数据处理面试题>,里面说到百度的一个面试题目,题目如下: ...
随机推荐
- Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named null
swing Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Pe ...
- CHARINDEX函数
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置.CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , st ...
- Java借助itext pdf生成固定格式pdf的模板工具类
这里是标题区域 这里是副标题1: 副标题的内容 这里是副标题2: 这里是副标题2的内容 这里是副标题3: 这里是副标题3的内容 序号 表头1 复合表头 表头2 子表头1 子表头2 子表头3 1 居左内 ...
- 贝叶斯--旧金山犯罪分类预测和电影评价好坏 demo
来源引用:https://blog.csdn.net/han_xiaoyang/article/details/50629608 1.引言 贝叶斯是经典的机器学习算法,朴素贝叶斯经常运用于机器学习的案 ...
- 微信小程序--每个独立的page的page.json只能修改window属性
app.json 配置项列表 app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. window配置 用于设置小程序的状态栏.导航条. ...
- 数据挖掘案例:基于 ReliefF和K-means算法的应用
数据挖掘案例:基于 ReliefF和K-means算法的应用 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘(DataMiriing),指的是从大型数据库 ...
- 【JZOJ5088】【GDOI2017第四轮模拟day2】最小边权和 排序+动态规划
题面 有一张n个点m条边的有向图,每条边有一个互不相同的边权w,有q个询问,要求你从点a经过不超过c条边到点b,要求经过的边权递增并和尽量小,求出最小的边权和,如果没有合法方案则输出-1. 对于100 ...
- 【JZOJ5086】【GDOI2017第四轮模拟day1】数列 折半搜索
题面 有一个长度为n 的排列,现在有一些位置的数已经模糊不清了,你只知道这个排列的逆序对个数是K,你能计算出总共有多少可能的排列吗? 对于100% 的数据,n <=10^3,K<=10^9 ...
- log4j:ERROR Could not read configuration file [log4j.properties]
遇到这个错误,程序能够正常运行,log4j.properties也在classpath中,后来在网上查了资料,把下面这个语句去掉就好啦. PropertyConfigurator.configure( ...
- ELK之elasticsearch安装&&kibana安装
1.ES和Kibana安装都是开箱即用的? 解压缩就可以用 elasticsearch解压缩之后,双击下图中的elasticsearch.bat,启动,kibana也是一样 双击之后, 我们看到上图有 ...