如何高效的完成ip地址到实际地理位置的转换

flyzhang 发表于 2008-06-04 13:03:12

    经常上互联网的人都知道,ip是可以很容易的转换为比较精确的地理位置的(比如以前的QQ IP版),你所需要的只是一个ip段到地理位置的库文件(比如说纯真IP库)。但是当你需要将以亿作为单位的ip记录转换为地理位置的时候,问题就来了:
    使用MySQL数据库将是一个非常缓慢的过程(至少当时我在使用MySQL 4的时候,对此无可奈何)。后来选择的方式是抛弃数据库,直接使用自己手写的程序进行处理,基本的设计是这样的:
  1. 设计一个ip段类(low ip, high ip),如果low ip 等于 high ip意思就是这个ip段已经退化为一个ip地址了
  2. 重载ip段类的==,<,>运算符,如果ip段互相包含就是相等,ip段互不相交就是<或者>,由于本应用不会出现ip段交叠而不重合的情况,所以上面的定义就已经足够了
  3. 使用STL的Map容器,把ip段类和地理位置装入,由于Map容器是才用红黑树实现的,红黑树是一种比较好的平衡检索树,将使得后面的查找过程相当快速,而且你在构造这个检索树的时候也会很放心和简单(至少比自己去写一个平衡树简单多了,而如果简单使用二叉查找树的话,处理树的平衡是个问题)
       链接是简短的代码
经过这样改造,上亿的数据ip转换也就是分分钟的事情。
    目前想到的两个改进是:
  1. 在查找前,加入一个cache层,因为据统计ip记录中每个ip平均重复出现的次数>6,这样的话至少有20%~40%的树查找操作可以在cache里面常数时间完成
  2. 使用hadoop,让这个程序成为分布式的


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定