最新IP地址数据库  来自 qqzeng.com

利用二分逼近(bisection method) ,每秒500多万, 比较高效!

多语言API解析Dat 导入数据库脚本
https://github.com/zengzhan/qqzeng-ip


原来的顺序查找算法 效率比较低

 readonly string ipBinaryFilePath = "qqzengipdb.dat";
readonly byte[] dataBuffer, indexBuffer;
readonly uint[] index = new uint[];
readonly int dataLength;
public IpLocation()
{
try
{
FileInfo file = new FileInfo(ipBinaryFilePath);
dataBuffer = new byte[file.Length];
using (var fin = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
{
fin.Read(dataBuffer, , dataBuffer.Length);
}
var offset_len = BytesToLong(dataBuffer[], dataBuffer[], dataBuffer[], dataBuffer[]); //Big Endian
indexBuffer = new byte[offset_len];
Array.Copy(dataBuffer, , indexBuffer, , offset_len);
dataLength = (int)offset_len;
for (int loop = ; loop < ; loop++)
{
//索引 四字节 LITTLE_ENDIAN
index[loop] = BytesToLong(indexBuffer[loop * + ], indexBuffer[loop * + ], indexBuffer[loop * + ], indexBuffer[loop * ]);
}
}
catch { }
} public string[] Find(string ip)
{
var ips = ip.Split('.');
uint ip_prefix = uint.Parse(ips[]);
uint find_uint32 = BytesToLong(byte.Parse(ips[]), byte.Parse(ips[]), byte.Parse(ips[]), byte.Parse(ips[]));//BIG_ENDIAN // LITTLE_ENDIAN
int max_len = ;
int resultOffset =-;
int resultLegth =-; uint start = index[ip_prefix] * + ;
if (ip_prefix != )
{
max_len = (int)index[ip_prefix + ] * + ;
}
else
{
max_len = (int)index[] * + +;
} for (; start < max_len; start += )
{
// 前四位 结束ip 后三位 偏移 最后一位 内容长度
uint endipNum = BytesToLong(indexBuffer[start + ], indexBuffer[start + ], indexBuffer[start + ], indexBuffer[start + ]);//BIG_ENDIAN
if (endipNum >= find_uint32)
{
resultOffset =(int) BytesToLong((byte), indexBuffer[start + ], indexBuffer[start + ], indexBuffer[start + ]);//LITTLE_ENDIAN
resultLegth = 0xFF & indexBuffer[start + ];// 长度
break;
}
}
if (resultOffset==-||resultLegth==-)
{
return new string[] {"N/A"};
}
var areaBytes = new byte[resultLegth];
Array.Copy(dataBuffer, dataLength + resultOffset - , areaBytes, , resultLegth);
return Encoding.UTF8.GetString(areaBytes).Split(' ');
} private static uint BytesToLong(byte a, byte b, byte c, byte d)
{ return ((uint)a << ) | ((uint)b << ) | ((uint)c << ) | (uint)d;
} public static string long2IP(long longIP)
{
StringBuilder sb = new StringBuilder("");
sb.Append(longIP >> );
sb.Append(".");
//将高8位置0,然后右移16为 sb.Append((longIP & 0x00FFFFFF) >> );
sb.Append("."); sb.Append((longIP & 0x0000FFFF) >> );
sb.Append(".");
sb.Append((longIP & 0x000000FF)); return sb.ToString(); }
  
}

改进版 采用二分逼近 算法(类似二分查找,但又不同)  性能提升很大

  public string[] Find(string ip)
{
var ips = ip.Split('.');
uint ip_prefix = uint.Parse(ips[]);
uint find_uint32 = BytesToLong(byte.Parse(ips[]), byte.Parse(ips[]), byte.Parse(ips[]), byte.Parse(ips[]));//BIG_ENDIAN
uint max_len = ;
int resultOffset = -;
int resultLegth = -;
uint start = index[ip_prefix];
if (ip_prefix != )
{
max_len = index[ip_prefix + ];
}
else
{
max_len = index[];
}
uint num = max_len - start;
uint my_index = BinarySearch(start, max_len, find_uint32);
start = my_index * + ;
resultOffset = (int)BytesToLong((byte), indexBuffer[start + ], indexBuffer[start + ], indexBuffer[start + ]);//LITTLE_ENDIAN
resultLegth = 0xFF & indexBuffer[start + ];// 长度 if (resultOffset == - || resultLegth == -)
{
return new string[] { "N/A" };
}
var areaBytes = new byte[resultLegth];
Array.Copy(dataBuffer, dataLength + resultOffset - , areaBytes, , resultLegth);
return Encoding.UTF8.GetString(areaBytes).Split(' ');
} /// <summary>
/// 二分逼近
/// </summary>
public uint BinarySearch(uint low, uint high, uint k)
{
uint M = ;
while (low <= high)
{
uint mid = (low + high) / ;
uint endipNum = GetStartIp(mid);
if (endipNum >= k)
{
M = mid; //mid有可能是解
high = mid - ;
}
else
low = mid + ;
}
return M;
}

有了上面高效算法  解析出来800多万数据 也很快   再用一个简单的ling 统计一下即可

  var cn_result= from r in list
group r by r.cn into g
select new { key = g.Key, cnt = g.Count() };

 800多万数据  统计组图  

微信公众号:qqzeng-ip

IP地址数据库: 

最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布的更多相关文章

  1. 最新IP地址数据库Dat格式-高性能高并发版(2017年1月)

    最新IP地址数据库->Dat格式 高性能格式->qqzeng-ip.dat 国内版-20170101-Dat 版                国外版-20170101-Dat 版     ...

  2. 最新IP地址数据库Dat格式-高性能高并发版(2019年3月)

    最新IP地址数据库->Dat  二进制文件 高性能高并发-qqzeng-ip.dat 格式 全球IP数据库-20190301-Dat 版                国内IP数据库-20190 ...

  3. 最新IP地址数据库

    2016年12月1日 最新发行版 265051条数据 基于:国内基于省市区以及运营商 国外基于国家 版本:全球旗舰版  国内精华版 国外拓展版 英文版 掩码版 字段:大洲 国家 省份 城市 县区 运营 ...

  4. IP地址数据库 | 手机号段归属地数据库 | 行政区划省市区数据库

    2019年4月最新版 IP地址数据库 (全球版·国内版·国外版·掩码版·英文版) 全球旗舰版 454267行   国内精华版 244379行 演示  https://www.qqzeng.com/ip ...

  5. IP地址数据库-ISP运营商列表(2017年1月)

    IP地址数据库  微信号:qqzeng-ip [全球旗舰版][国内精华版][国外拓展版][英文版][掩码版]     http://qqzeng.com 中国大陆:三大基础运营商 中国电信中国联通中国 ...

  6. 数据库遇到的问题——mysql在线修改表结构大数据表的风险与解决办法归纳

    互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需要我来考虑,虽然我们没 ...

  7. 数据库已经最优,每次操作50万条数据,怎么提高API接口的速度?

    第一种可以使用负载均衡,10台,就每台5W条数据第二种每台机器.可以把添加任务队列.利用多线程解决IO密集型任务的特点.第三种利用异步协程方式提高调度行为

  8. 手机号段、ip地址归属地大全,最新手机号段归属地,IP地址归属地数据库

    百事通:http://www.114best.com/dh/114.aspx?w=17097232323,联通识别为电信的,1349错 二三四五:http://tools.2345.com/frame ...

  9. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...

随机推荐

  1. 【BZOJ】3309: DZY Loves Math

    题意 \(T(T \le 10000)\)次询问,每次给出\(a, b(1 \le a, b \le 10^7)\),求 \[\sum_{i=1}^{a} \sum_{j=1}^{b} f((i, j ...

  2. 将Matlab中的矩阵输出到txt文件

    将矩阵输出到txt文件中的方法,遍寻网络,始见真经!!! fid=fopen('C:Documents and Settingscleantotal.ped','wt');%写入文件路径 matrix ...

  3. struts2自定义MVC框架

    自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...

  4. python学习 第一天

    正式学习python第一天,网上找到了python教程,带练习题的,又装了ubuntu. 这是学习笔记: list[]: 可变,append/1,insert/2,pop/index? tuple() ...

  5. Oracel EBS - Response

    Oracle ERP Response:

  6. matlab函数大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  7. HBuilder从下载到使用

    听别人谈论这货,于是决定长长见识,见见世面,便屁颠屁颠到网上下一个,满怀好奇的研究了一下.对用过eclipse这款软件的人来说,上手非常容易. ☆ 准备工作 ① 确认自己的电脑连接网络,能下载东西. ...

  8. php实现网页trace方法

    // 记录内存初始使用和开始时间,在系统的入口记录 $beginTime= microtime(TRUE); $start_memory = memory_get_usage(); //die; ec ...

  9. springboot+solr

    整合完DB层,cache层,开始整合solr. 注入SolrClient, package hello.configuration; import java.net.MalformedURLExcep ...

  10. 著名的sql注入问题-问题的原因分析及总结

    Statement安全漏洞(sql注入问题)问题展示: 首先我的Mysql数据库中有一张users表,如下图所示 /** * 根据用户名查询用户 * @param username 需要查询的用户名 ...