二分查找法

php根据二分查找法从普通csv文件中获取ip的地理位置(效率比使用mysql提高近800倍)

丶灬走出姿态 提交于 2019-12-11 22:16:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近要做一个全球的ip地理位置查询,并且要精确到城市一级,还要求是英文版的. 首先是要找ip库, 纯真ip 库只有中文的,而且国内的ip缺少国家这一级的分类,放弃 apnic 的倒是不错,英文而且更新也快,但是只有国家一级. 终于电驴上找到了相关的资源 IP地理位置数据库 世界城镇扩展版 130812 数据来源于 MaxMind , 也算比较新的. 这个比较符合要求. 数据源是csv格式的. 格式如下: 16777472 16778239 CN CHN China 16785408 16793599 CN CHN Guangzhou, Guangdong, China 前两列是ip端 , 三四列 是国家英文名缩写, 第五列是 国家和地区,用逗号分割的. 看到这个数据,第一反应是导入到mysql数据库然后从数据库查询,但是看了下总数据大概有接近200w条.总大小130M 预计mysql查询起来也不会太快. 于是自己弄了个简单版的二分查找法.这样可以直接在csv文件中查找,无需导入数据库,查询效率也不低. 总体思路是这样. 先用php读取csv文件的每行数据, 获取该行数据的大小.然后建立一个二进制的索引文件 索引文件的格式如下: start_ip end_ip offset length start