最新IP数据库 存储优化 查询性能优化 每秒解析上千万

高性能IP数据库格式详解

每秒解析1000多万ip  qqzeng-ip-ultimate.dat 3.0版

编码:UTF8     字节序:Little-Endian

返回规范字段(如:亚洲|中国|香港|九龙|油尖旺|新世界电讯|810200|Hong Kong|HK|114.17495|22.327115)

------------------------ 文件结构  -------------------------
// 文件头 4字节
[IP段数量]

// 前缀区 8字节(4-4) 256*8
[索引区start第几个][索引区end第几个]


// 索引区 8字节(4-3-1) ip段行数x8
[结束IP数字][地区流位置][流长度]

// 内容区 长度无限制
[地区信息][地区信息]……唯一不重复

------------------------ 文件结构 ---------------------------

优势:压缩形式将数据存储在内存中,通过减少将相同数据读取到内存的次数来减少I/O.
          较高的压缩率通过使用更小的内存中空间提高查询性能。
          前缀区为作为缩小查询范围,索引区和内容区长度一样,
          解析出来一次性加载到数组中,查询性能提高3-5倍!

压缩:原版txt为38.5M,生成dat结构为3.68M 。
          和上一版本2.0不同的是索引区去掉了[开始IP数字]4字节,节省多1-2M。
          3.0版本只适用[全球版],条件为ip段区间连续且覆盖所有IPV4。
          2.0版本适用[全球版][国内版][国外版]

性能:每秒解析1000多万ip 

创建:qqzeng-ip 于 2018-04-08

 

性能测试   ( CPU i7-7700K + DDR2400 16G + win10 X64 )

查询【3.0】内存优化版 3414万ip->3.318秒 每秒1028.93309222423万次
查询【3.0】内存优化版 4439万ip->4.199秒 每秒1057.1564658252万次
查询【3.0】内存优化版 4056万ip->3.821秒 每秒1061.50222454855万次
查询【3.0】内存优化版 1781万ip->1.68秒 每秒1060.11904761905万次
查询【3.0】内存优化版 3862万ip->3.66秒 每秒1055.1912568306万次
查询【3.0】内存优化版 3479万ip->3.31秒 每秒1051.05740181269万次
查询【3.0】内存优化版 2892万ip->2.713秒 每秒1065.97862145227万次
查询【3.0】内存优化版 3484万ip->3.263秒 每秒1067.72908366534万次
查询【3.0】内存优化版 2699万ip->2.548秒 每秒1059.26216640502万次
查询【3.0】内存优化版 88万ip->0.087秒 每秒1011.49425287356万次
查询【3.0】内存优化版 161万ip->0.153秒 每秒1052.28758169935万次
查询【3.0】内存优化版 91万ip->0.088秒 每秒1034.09090909091万次
查询【3.0】内存优化版 42万ip->0.041秒 每秒1024.39024390244万次
查询【3.0】内存优化版 159万ip->0.152秒 每秒1046.05263157895万次
查询【3.0】内存优化版 88万ip->0.084秒 每秒1047.61904761905万次
查询【3.0】内存优化版 123万ip->0.118秒 每秒1042.37288135593万次
查询【3.0】内存优化版 106万ip->0.101秒 每秒1049.50495049505万次
查询【3.0】内存优化版 61万ip->0.059秒 每秒1033.89830508475万次
查询【3.0】内存优化版 177万ip->0.169秒 每秒1047.33727810651万次
查询【3.0】内存优化版 106万ip->0.101秒 每秒1049.50495049505万次

查询【3.0】普通优化版 1464万ip->3.408秒 每秒429.577464788732万次
查询【3.0】普通优化版 352万ip->0.803秒 每秒438.356164383562万次
查询【3.0】普通优化版 1357万ip->3.042秒 每秒446.088099934254万次
查询【3.0】普通优化版 184万ip->0.43秒 每秒427.906976744186万次
查询【3.0】普通优化版 752万ip->1.697秒 每秒443.134944018857万次
查询【3.0】普通优化版 1795万ip->4.032秒 每秒445.188492063492万次
查询【3.0】普通优化版 1823万ip->4.076秒 每秒447.252208047105万次
查询【3.0】普通优化版 723万ip->1.622秒 每秒445.745992601726万次
查询【3.0】普通优化版 136万ip->0.319秒 每秒426.332288401254万次
查询【3.0】普通优化版 334万ip->0.756秒 每秒441.798941798942万次
查询【3.0】普通优化版 636万ip->1.435秒 每秒443.205574912892万次
查询【3.0】普通优化版 701万ip->1.578秒 每秒444.233206590621万次
查询【3.0】普通优化版 1807万ip->4.07秒 每秒443.980343980344万次
查询【3.0】普通优化版 489万ip->1.105秒 每秒442.533936651584万次

 

 

随机生成 IP

 RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();byte[] bytes = new byte[4];rngCsp.GetBytes(bytes);uint value = ReadBigEndian32(bytes[0], bytes[1], bytes[2], bytes[3]);

 

 

开发参考 (解析dat以及查询)

    public class IPSearch3Fast{private static readonly Lazy<IPSearch3Fast> lazy = new Lazy<IPSearch3Fast>(() => new IPSearch3Fast());public static IPSearch3Fast Instance { get { return lazy.Value; } }private IPSearch3Fast(){LoadDat();Watch();}private string datPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"qqzeng-ip-ultimate.dat");private DateTime lastRead = DateTime.MinValue;private long[,] prefmap = new long[256, 2];private uint[] endArr;private string[] addrArr;private byte[] data;/// <summary>/// 初始化二进制 qqzeng-ip-ultimate.dat 数据/// </summary>private void LoadDat(){data = File.ReadAllBytes(datPath);for (int k = 0; k < 256; k++){int i = k * 8 + 4;int prefix = k;long startIndex = ReadLittleEndian32(data[i], data[i + 1], data[i + 2], data[i + 3]);long endIndex = ReadLittleEndian32(data[i + 4], data[i + 5], data[i + 6], data[i + 7]);prefmap[k, 0] = startIndex; prefmap[k, 1] = endIndex;}uint RecordSize = ReadLittleEndian32(data[0], data[1], data[2], data[3]);endArr = new uint[RecordSize];addrArr = new string[RecordSize];for (int i = 0; i < RecordSize; i++){long p = 2052 + (i * 8);uint endipnum = ReadLittleEndian32(data[p], data[1 + p], data[2 + p], data[3 + p]);int offset = data[4 + p] + ((data[5 + p]) << 8) + ((data[6 + p]) << 16);int length = data[7 + p];endArr[i] = endipnum;addrArr[i] = Encoding.UTF8.GetString(data, offset, length);}}private void Watch(){FileInfo fi = new FileInfo(datPath);FileSystemWatcher watcher = new FileSystemWatcher(fi.DirectoryName){IncludeSubdirectories = false,NotifyFilter = NotifyFilters.LastWrite,Filter = "qqzeng-ip-ultimate.dat",};watcher.Changed += (s, e) =>{var lastWriteTime = File.GetLastWriteTime(datPath);if (lastWriteTime > lastRead){                   //延时 解决 正由另一进程使用,因此该进程无法访问此文件Thread.Sleep(1000);LoadDat();lastRead = lastWriteTime;}};watcher.EnableRaisingEvents = true;}/// <summary>/// ip快速查询方法/// </summary>/// <param name="ip">1.1.1.1</param>/// <returns></returns>public string Find(string ip){long val = IpToInt(ip, out long pref);long low = prefmap[pref, 0], high = prefmap[pref, 1];long cur = low == high ? low : BinarySearch(low, high, val);return addrArr[cur];}// 二分逼近 O(logN)private long BinarySearch(long low, long high, long k){long M = 0, mid = 0;while (low <= high){mid = (low + high) / 2;uint endipnum = endArr[mid];if (endipnum >= k){M = mid;if (mid == 0){break;   //防止溢出
                    }high = mid - 1;}elselow = mid + 1;}return M;}private long IpToInt(string ipString, out long prefix){//高性能int end = ipString.Length;unsafe{fixed (char* name = ipString){int numberBase = 10;char ch;long[] parts = new long[4];long currentValue = 0;int dotCount = 0;int current = 0;for (; current < end; current++){ch = name[current];currentValue = 0;numberBase = 10;if (ch == '0'){numberBase = 8;current++;if (current < end){ch = name[current];if (ch == 'x' || ch == 'X'){numberBase = 16;current++;}}}for (; current < end; current++){ch = name[current];int digitValue;if ((numberBase == 10 || numberBase == 16) && '0' <= ch && ch <= '9'){digitValue = ch - '0';}else if (numberBase == 8 && '0' <= ch && ch <= '7'){digitValue = ch - '0';}else if (numberBase == 16 && 'a' <= ch && ch <= 'f'){digitValue = ch + 10 - 'a';}else if (numberBase == 16 && 'A' <= ch && ch <= 'F'){digitValue = ch + 10 - 'A';}else{break;}currentValue = (currentValue * numberBase) + digitValue;}if (current < end && name[current] == '.'){parts[dotCount] = currentValue;dotCount++;continue;}break;}parts[dotCount] = currentValue;prefix = parts[0];return (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ((parts[2] & 0xff) << 8) | (parts[3] & 0xff);}}//简洁的 普通 //byte[] b = IPAddress.Parse(ip).GetAddressBytes();//prefix = b[0];  // return ReadBigEndian32(b[0], b[1], b[2], b[3]);
        }private uint ReadBigEndian32(byte a, byte b, byte c, byte d){return (uint)((a << 24) | (b << 16) | (c << 8) | d);}private uint ReadLittleEndian32(byte a, byte b, byte c, byte d){return (uint)(a | (b << 8) | (c << 16) | (d << 24));}}/*(调用例子):   string result = IPSearch3Fast.Instance.Find("1.2.3.4");--> result="亚洲|中国|香港|九龙|油尖旺|新世界电讯|810200|Hong Kong|HK|114.17495|22.327115"*/

 

开发代码:https://github.com/zengzhan/qqzeng-ip

 

转载于:https://www.cnblogs.com/zengxiangzhan/p/8816243.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HALCON示例程序stamp_catalogue.hdev分割图片与文字

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序stamp_catalogue.hdev分割图片与文字 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 gen_rectangle1 (Rect, 0, 0, 5, 5) dev_update_var (‘off’) dev_update_window (‘off’) dev_close_win…

[BZOJ]1023: [SHOI2008]cactus仙人掌图

Time Limit: 1 Sec Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路&#xff08;simple cycle&#xff09;里&#xff0c;我们就称这张图为仙人掌图&#xff08;cactus&#xff09;。所谓简单回路就是指在图上不重复经过任何一个顶…

实现RTP协议的H.264视频传输系统

1. 引言 随着信息产业的发展&#xff0c;人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频&#xff0c;并越来越强调获取资源的实时性和互动性。但人们又面临着另外一种不可避免的尴尬&#xff0c;就是在网络上看到生动清晰的媒体演示的同时&#xff0c;不得…

机器人网首页应用实例工业自动化 EtherCAT 技术在库卡机器人控制系统上的应用

自 2010 年以来&#xff0c;库卡一直采用 EtherCAT 技术作为所有库卡机器人控制系统中的系统总线。最新的 KR AGILUS 机器人和 LBR iiwa 轻型机器人的紧凑型控制器也是在 EtherCAT 基础上实施的。Beckhoff 基于工业以太网的 EtherCAT因而可以作为整个当前库卡控制系统范围内的…

KVM虚拟机共享存储动态迁移与冷迁移

运行环境一、 配置nfs共享服务器二、 配置KVM虚拟化三、 创建桥接网卡四、 配置kvm服务器并实现动态迁移五、 配置冷迁移运行环境KVM虚拟机两台&#xff08;linux 7.4&#xff09;IP地址&#xff1a;192.168.80.100&#xff08;KVM01&#xff09;IP地址&#xff1a;192.168.80.…

HALCON示例程序surface_scratch.hdev提取划痕

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序surface_scratch.hdev提取划痕 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () dev_close_window () read_image (Image, ‘surface_scratch’) get_image_size (Image, Width…

MySQL--SQL中的安全问题

---恢复内容开始--- 1) SQL 注入简介 SQL 注入(SQL Injection) 就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中&#xff0c;从而达到入侵数据库乃至操作系统的目的。他的产生主要是由程序对用户输入的数据没有进行严格的过滤&#xff0c;导致非法…

伺服驱动器的 三环控制 电流环 速度环 位置环

运动伺服一般都是三环控制系统&#xff0c;从内到外依次是电流环速度环位置环。 1、电流环&#xff1a;电流环的输入是速度环PID调节后的那个输出&#xff0c;我们称为“电流环给定”吧&#xff0c;然后呢就是电流环的这个给定和“电流环的反馈”值进行比较后的差值在电流环内做…

理解LSTM/RNN中的Attention机制

转自&#xff1a;http://www.jeyzhang.com/understand-attention-in-rnn.html&#xff0c;感谢分享&#xff01; 导读 目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门&#xff0c;是因为它在许多领域较其他的传统模型方法都取得了更好的结果。这种结构的模型通常将…

linux下基于jrtplib库的实时传送实现

linux 下基于jrtplib库的实时传送实现一、RTP 是进行实时流媒体传输的标准协议和关键技术实时传输协议&#xff08;Real-time Transport Protocol&#xff0c;PRT&#xff09;是在 Internet 上处理多媒体数据流的一种网络协议&#xff0c;利用它能够在一对一&#xff08;unicas…

[BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)

Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样&#xff1a;$f[n]f[n-1]*10^kn$ 对于每一段位数个数相同的$n$&#xff08;如$10\sim99,100\sim999,23333\sim66666,1018701389\sim2147483647$&#xff09;&#xff0c;$k$是个定值 然…

HALCON示例程序texture.hdev检测树木

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序texture.hdev检测树木 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_close_window () Interactive : 0 dev_close_window () read_image (MreutHill, ‘mreut_y’) get_image_size (MreutH…

1、python基础速成

基础模块 def prt(age,name):#函数定义 print("%s is %d 年龄 old"%(name,age)) if __name__"__main__":#程序入口 print("Hello World") prt(45,"gaici") 获取输入&#xff1a;使用input()函数 nameinput("you name &#x…

老男孩博客园杨海潮MySQL--MySQL机构逻辑2

转载于:https://blog.51cto.com/yanfeilai528/2103403

法国标致雪铁龙汽车公司采用通快碟片激光器进行焊接

发布日期&#xff1a;2011-10-14 来源&#xff1a;光电新闻网 发布人&#xff1a;星之球科技 摘要&#xff1a;3月11日消息&#xff0c;十一个碟片激光器&#xff08;disk laser&#xff09;将安装在标致雪铁龙集团的工厂&#xff0c;这家法国汽车制造商准备使用4千瓦的激光器…

h.264 rtp打包

(2011-05-27 08:44:13) 转载标签&#xff1a; 杂谈 payload,H.264 RTP payload 格式 on 2011-2-18 in 博文摘选 | 0 Comment 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------…

jquery live hover绑定方法

$(".select_item span").live({mouseenter:function(){$(this).addClass("hover");},mouseleave:function(){$(this).removeClass("hover");} }); 注意&#xff1a;jquery1.9以上版本不支持live&#xff0c;新方法为on 转载于:https://www.cnblo…

HALCON示例程序vessel.hdev血管的分割与测量

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序vessel.hdev血管的分割与测量 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_window (‘off’) dev_close_window () dev_open_window (0, 0, 512, 512, ‘black’, WindowID) set_d…

电子凸轮

CAM功能是按照一种人为预先设定的曲线关系(可以在线修改,对SEW的变频/伺服控制器而言)来运动的控制应用。 100%速度前馈的位置控制这个观点偶不敢苟同.典型的一些应用。比如:全自动包装机械上,移动锯,其实大家说的电子齿轮&#xff0c;指的就是一种可以调节主从速度比的同步应用…

浙南联合训练赛20180414

这次题目的代码都不长&#xff0c;CF的一贯风格 A - Game CodeForces - 513A Two players play a simple game. Each player is provided with a box with balls. First players box contains exactly n1 balls and second players box contains exactly n2balls. In one move…