查询纯真IP数据库(Python)
davies 发表于 2005 年 05 月 18 日
下午花了四个小时用Python写这个程序,效果不理想,运行速度慢。用Python来处理二进制文件不是一个好的选择,它总是把文件当作字符串读进来,还要用Struct模块进行转化。
纯真IP数据库的格式是已知的,Luma写了一份很详尽文档,在这里 ,还提供了Java版本的代码。
该数据库格式总体来说还可以,但有一个地方非常不爽,记录的偏移量用三个字节表示,操作起来很不方便。估计作者也就是为了节省空间,但是用四个字节的话,顶多也就增加百分之十几的空间,已经是四五兆的文件了,再大一点也无所谓。
源代码贴在这里 ,供以后参考。准备晚上再写一个C版本的,学习做Python模块。
网友留言:
2. 发表于 2006 年 02 月 28 日 11:31 p.m.
多谢,那自然string2ip也可以用inet_aton代替了,以更新
3. 发表于 2006 年 03 月 1 日 12:56 a.m.
呵呵,刚才没有仔细看程序,我觉得这个程序效率地下的主要问题,还是因为文件操作太细碎了,如果一次就全部装载到一个字符串里面,然后进行操作,速度会快很多(第一次除外). 太晚了,希望明天有空能写一个出来.
4. 发表于 2006 年 03 月 1 日 11:50 a.m.
5. 发表于 2006 年 03 月 1 日 9:16 p.m.
在程序每次执行查询次数少的情况下,两个程序的效率差不多,甚至不预读还要快一点点。单次运行查询次数越多,你的程序优势越明显。此时索引区的数据利用频繁,只预读索引区的数据并处理成list,则效率会更高。
6. 发表于 2006 年 11 月 9 日 4:12 p.m.
去年夏天用c写了一个,使用mmap把数据放到内存中,查询非常快!
1. 发表于 2006 年 02 月 28 日 11:18 p.m.
ip2string这个,可以用socket中的inet_ntoa来代替
socket.inet_ntoa('\x20\x22\x23\x24')
'32.34.35.36'