我计划在4700万ips上运行反向DNS。这是我的代码
with open(file,'r') as f:
with open ('./ip_ptr_new.txt','a') as w:
for l in f:
la = l.rstrip('\n')
ip,countdomain = la.split('|')
ips.append(ip)
try:
ais = socket.gethostbyaddr(ip)
print ("%s|%s|%s" % (ip,ais[0],countdomain), file = w)
except:
print ("%s|%s|%s" % (ip,"None",countdomain), file = w)
目前它很慢。有人建议加快速度吗?
答案 0 :(得分:1)
尝试使用多处理模块。我已经计时了大约8000 ips,我得到了这个:
#dns.py
real 0m2.864s
user 0m0.788s
sys 0m1.216s
#slowdns.py
real 0m17.841s
user 0m0.712s
sys 0m0.772s
# dns.py
from multiprocessing import Pool
import socket
def dns_lookup(ip):
ip, countdomain = ip
try:
ais = socket.gethostbyaddr(ip)
print ("%s|%s|%s" % (ip,ais[0],countdomain))
except:
print ("%s|%s|%s" % (ip,"None",countdomain))
if __name__ == '__main__':
filename = "input.txt"
ips = []
with open(filename,'r') as f:
with open ('./ip_ptr_new.txt','a') as w:
for l in f:
la = l.rstrip('\n')
ip,countdomain = la.split('|')
ips.append((ip, countdomain))
p = Pool(5)
p.map(dns_lookup, ips)
#slowdns.py
import socket
from multiprocessing import Pool
filename = "input.txt"
if __name__ == '__main__':
ips = []
with open(filename,'r') as f:
with open ('./ip_ptr_new.txt','a') as w:
for l in f:
la = l.rstrip('\n')
ip,countdomain = la.split('|')
ips.append(ip)
try:
ais = socket.gethostbyaddr(ip)
print ("%s|%s|%s" % (ip,ais[0],countdomain), file = w)
except:
print ("%s|%s|%s" % (ip,"None",countdomain), file = w)
答案 1 :(得分:0)
这里的一个解决方案是使用带有选项timeout的nslookup shell commande。可能是主持人命令...... 一个不完美但有用的例子!
def sh_dns(ip,dns):
a=subprocess.Popen(['timeout','0.2','nslookup','-norec',ip,dns],stdout=subprocess.PIPE)
sortie=a.stdout.read()
tab=str(sortie).split('=')
if(len(tab)>1):
return tab[len(tab)-1].strip(' \\n\'')
else:
return ""
答案 2 :(得分:0)
我们最近也不得不处理这个问题。 在多个进程上运行并不能提供足够好的解决方案。 从一台强大的AWS机器处理数百万个IP可能需要几天的时间。 使用Amazon EMR效果很好,在10台计算机集群上花费了大约半小时。 一台机器(通常是一个网络接口)不能扩展太多,因为这是一项网络密集型任务。在多台计算机上使用Map Reduce确实可以完成工作。