我有一个由大约200,000个IP地址和10,000个形如(1.1.1.1/24)的子网组成的集合。对于每个IP地址,我需要检查它是否属于这些子网之一,但由于数据集很大且计算能力较低,因此我希望有一个高效的实现方式。
在搜索时,我找到了一种方法(链接:https://dev59.com/8HRA5IYBdhLWcg3wzhRY#820124)。
但由于我需要循环处理超过200,000个IP地址,并且对于每个地址循环处理10,000个子网,因此我不确定这是否有效。我的第一个疑问是,“IPAddress() in IPNetwork()”只是线性扫描还是以某种方式进行了优化?
我想到的另一个解决方案是创建包含所有IP子网中包含的IP的列表(大约有13,000,000个IP,没有重复),然后对其进行排序。如果我这样做,在循环处理200,000个IP地址时,我只需要在更大的IP地址集上对每个IP执行二进制搜索。
我可以按照以下方式执行二分查找:
在搜索时,我找到了一种方法(链接:https://dev59.com/8HRA5IYBdhLWcg3wzhRY#820124)。
from netaddr import IPNetwork, IPAddress
if IPAddress("192.168.0.1") in IPNetwork("192.168.0.0/24"):
print "Yay!"
但由于我需要循环处理超过200,000个IP地址,并且对于每个地址循环处理10,000个子网,因此我不确定这是否有效。我的第一个疑问是,“IPAddress() in IPNetwork()”只是线性扫描还是以某种方式进行了优化?
我想到的另一个解决方案是创建包含所有IP子网中包含的IP的列表(大约有13,000,000个IP,没有重复),然后对其进行排序。如果我这样做,在循环处理200,000个IP地址时,我只需要在更大的IP地址集上对每个IP执行二进制搜索。
for ipMasked in ipsubnets: # Here ipsubnets is the list of all subnets
setUnmaskedIPs = [str(ip) for ip in IPNetwork(ipMasked)]
ip_list = ip_list + setUnmaskedIPs
ip_list = list(set(ip_list)) # To eliminate duplicates
ip_list.sort()
我可以按照以下方式执行二分查找:
for ip in myIPList: # myIPList is the list of 200,000 IPs
if bin_search(ip,ip_list):
print('The ip is present')
这种方法是否比其他方法更高效?或者有没有其他更高效的方法来执行这个任务?