【问题标题】:Efficient ip lookup高效的ip查找
【发布时间】:2015-01-16 17:40:20
【问题描述】:

我有一个文件 f1,其中包含 42,000,000 个 IP 地址的列表。 我有另一个文件 f2,其中包含 ipranges 及其相关所有者的字典,例如:

Regional Physicians Neuroscience,[('66.110.238.100', '66.110.238.100')]
Coast Institute of Technology,[('41.89.132.0', '41.89.132.255')]
House Of Flowers,[('69.15.170.220', '69.15.170.223'), ('108.178.223.20', '108.178.223.23')]

现在我想知道 f1 中的每个 ip 找到其关联范围和所有者的最有效方法是什么。例如像:

ip1, House Of Flowers , ('69.15.170.220', '69.15.170.223')

有人可以在这方面帮助我吗?

【问题讨论】:

    标签: python networking ip lookup


    【解决方案1】:

    我们假设 ip 范围不能重叠;因此,如果您按基地址升序对它们进行排序,则可以使用bisect.bisect_left 对数组进行索引。那么如果array[index].first_address <= search_address <= .last_address你找到了匹配,否则不存在匹配。

    或者,将其全部转储到数据库中,在 first_address 和 last_address 上建立索引,让数据库担心有效搜索。见the sqlite documentation

    【讨论】:

      【解决方案2】:

      一次非pythonic...

      如果可能的所有者总数很少(少于 255),但范围的数量很大(数百个),您可以将每个 IP 转换为它所代表的四字节整数,然后用它来索引一个巨大的字节数组

      找到的字节值为所有者编号,255表示没有人。

      如果您首先测试您的所有者实际需要的最小-最大范围,则所需的阵列最大为 4 GB,而且要小得多。

      【讨论】:

        猜你喜欢
        • 2020-01-16
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 2018-04-13
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多