在 300 万行 CIDR 格式的 IP 范围内快速定位 IP 地址

Quickly locate an IP address within 3 million rows of CIDR formatted IP ranges

我已经获取到基于IP的地理定位数据库,格式如下:

1.0.0.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.1.0/24,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.2.0/23,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.4.0/22,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.8.0/21,1814991,1814991,,0,0,,34.7725,113.7266,50
...
223.255.254.0/24,1880252,1880251,,0,0,37,1.3267,103.8869,5
223.255.255.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000

一个 CSV 文件中总共包含超过 300 万行。每行的第一部分是 CIDR 格式的 IP 范围。

我需要一种有效的方法来在这些线路中快速定位给定的 IP 地址。比如给定IP地址1.0.1.2,我想快速定位到第二行,然后就可以得到它的坐标,也就是这一行剩下的数据。我想知道是否有任何有效的方法可以做到这一点,而不是从头开始检查每一行。

难点在于,例如,IP范围1.0.2.0/23包含IP地址1.0.3.0,所以单纯的字符串匹配不会很好。

def search_line(csv, ip):
    for line in csv:
        if line.startswith(ip):
            return line

我自己找到了办法。首先将8位分段的IP地址转换为十进制格式,使CIDR格式的IP范围变成两位十进制数。然后我使用bisect模块找到IP所属的范围