This topic created in 3803 days ago, the information mentioned may be changed or developed.
数据格式如下
0.0.0.0,1.1.1.0, 信息 0
1.1.1.1,2.2.2.2, 信息 1
2.2.2.3,2.5.5.5, 信息 3
2.5.5.6,...
文本数据量非常大,不方便一次全读入内存,如果 grep 一个 ip 地址也可能落在区间找不到
有什么方法可以既压缩数据,又方便查找么
sqlite 可以么,能否支持查询 ip 区间
(程序语言希望用 python 实现)
Supplement 1 · Jan 14, 2016
24 replies • 2016-01-14 23:31:29 +08:00
 |
|
1
sunchen Jan 12, 2016
ip 地址转化成 32 位数字, 然后经典的 bitmap 查找
|
 |
|
2
popu111 Jan 12, 2016 via Android
跑一遍存到 MySQL 里面去,然后就好多啦⊙▽⊙
|
 |
|
4
paw Jan 12, 2016
|
 |
|
5
picasso250 Jan 12, 2016
新建一个 table ipt 有 3 列,如下: ip_start int ip_end int info varchar
在 ip_start 和 ip_end 上各建一个索引
将这个 txt 跑一遍,存下来
select * from ipt where ip_start <= ? and ip_end >= ?
|
 |
|
8
congeec Jan 12, 2016 via iPhone
转 32bit 数字然后存到数据库 实在要文本的话用 btree 建立索引吧 最后别忘了加缓存
|
 |
|
9
congeec Jan 12, 2016 via iPhone
文本只读不写的话可以分段多进程搜索,毕竟没有数据竞争,安全
|
 |
|
10
lululau Jan 12, 2016
我怎么记得一个国内的 IP 库也就几十 MB
|
 |
|
13
TaMud Jan 12, 2016
ip 数据库都能卖钱〜〜〜〜〜
|
 |
|
14
ryd994 Jan 12, 2016
用 CIDR ,查询的时候按 prefix 长度顺序查
|
 |
|
18
raysonx Jan 12, 2016 via Android
IP 地址轉為 32 位二進制存儲,建立索引使用二分查找
|
 |
|
19
h4x3rotab Jan 12, 2016 via iPhone 1
数据和 key 分离是必须的,你肯定要一个索引。
首先 ipv4 地址就是一个 int32 ,所以 key 很好处理。其次要看你的区间会不会重叠,没有交集自然随便搞,是排序之后二分查找,还是丢进什么可以查找的树结构都没问题。但是如果区间会重合,上面大多数人的答案都是错的。
对于重合的区间查找,要用区间树或者线段树才能有效保证查询效率,其他所有的做法都不靠谱, bitmap 只适用于分布均匀的小量数据,只支持一个 key 的各种容器或者数据库就更不用考虑了,最坏情况要遍历大半个索引。
|
 |
|
22
KentY Jan 13, 2016
先说说有多大
|
 |
|
23
caocheng Jan 13, 2016
比如 postgres 数据库有 inet 类型
|