第十四章:提取出某日访问百度次数最多的那个IP

2024-02-01 05:18

本文主要是介绍第十四章:提取出某日访问百度次数最多的那个IP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提取出某日访问百度次数最多的那个IP

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

分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 创建一个unsigned count[N];的数组,即可统计出每个IP的访问次数

#include <fstream>  
#include <iostream>  
#include <ctime>  using namespace std;  
#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       //需分配内存的大小为 MEM_SIZE*sizeof(unsigned)     char* data_path="D:/test/ip.dat";        //ip数据  //产生n个随机IP地址  
void make_data(const int& n)         
{  ofstream out(data_path,ios::out|ios::binary);  srand((unsigned)(time(NULL)));  if (out)  {  for (int i=0; i<n; ++i)  {  unsigned val=unsigned(rand());           val = (val<<24)|val;              //产生unsigned类型的随机数  out.write((char *)&val,sizeof (unsigned));  }  }  out.close();
}  //找到访问次数最大的ip地址  
int main()  
{  //make_data(100);     //   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<<"open file"<<i<<"error"<<endl;  }  }  ifstream infile(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[ID(data)].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;     //最大只出现的次数  //分配512M内存,用于统计每个数出现的次数  unsigned *count = new unsigned[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地址.  }  }  }  delete[] count;  unsigned char *result=(unsigned char *)(&max_ip);  printf("出现次数最多的IP为:%d.%d.%d.%d,共出现%d次\n",   result[0], result[1], result[2], result[3], max_times);  
}  



这篇关于第十四章:提取出某日访问百度次数最多的那个IP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666185

相关文章

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在