2

DNSBL からの数千のドメイン名のリストを Dig で処理し、URL と IP の CSV を作成しています。これは非常に時間のかかるプロセスであり、数時間かかる場合があります。サーバーの DNSBL は 15 分ごとに更新されます。サーバーの更新に対応するために、Python スクリプトのスループットを向上させる方法はありますか?

編集:要求に応じてスクリプト。

import re
import subprocess as sp

text = open("domainslist", 'r')
text = text.read()
text = re.split("\n+", text)

file = open('final.csv', 'w')

for element in text:
        try:
            ip = sp.Popen(["dig", "+short", url], stdout = sp.PIPE)
            ip = re.split("\n+", ip.stdout.read())
            file.write(url + "," + ip[0] + "\n")
        except:
            pass
4

4 に答える 4

2

ここでの時間の大部分はへの外部呼び出しに費やされているdigため、その速度を向上させるには、マルチスレッド化する必要があります。digこれにより、に複数の呼び出しを同時に実行できるようになります。例を参照してください:スレッドからのPythonSubprocess.Popenまたは、Twisted( http://twistedmatrix.com/trac/ )を使用できます。

編集:あなたは正しいです、その多くは不要でした。

于 2010-06-22T00:57:25.980 に答える
2

名前解決に時間がかかっている可能性があります。それを数えれば (つまり、何らかの形で dig が非常に迅速に返された場合)、Python は何千ものエントリを簡単に処理できるはずです。

つまり、スレッド化されたアプローチを試す必要があります。これは、(理論的には)順次ではなく、同時に複数のアドレスを解決します。そのために引き続き dig を使用することもできます。そのために以下のサンプル コードを変更するのは簡単なはずですが、興味深いものにするために (そしてうまくいけばもっと Pythonic に)、既存のモジュールを使用してみましょう: dnspython

したがって、次のようにインストールします。

sudo pip install -f http://www.dnspython.org/kits/1.8.0/ dnspython

そして、次のようなことを試してください。

import threading
from dns import resolver

class Resolver(threading.Thread):
    def __init__(self, address, result_dict):
        threading.Thread.__init__(self)
        self.address = address
        self.result_dict = result_dict

    def run(self):
        try:
            result = resolver.query(self.address)[0].to_text()
            self.result_dict[self.address] = result
        except resolver.NXDOMAIN:
            pass


def main():
    infile = open("domainlist", "r")
    intext = infile.readlines()
    threads = []
    results = {}
    for address in [address.strip() for address in intext if address.strip()]:
        resolver_thread = Resolver(address, results)
        threads.append(resolver_thread)
        resolver_thread.start()

    for thread in threads:
        thread.join()

    outfile = open('final.csv', 'w')
    outfile.write("\n".join("%s,%s" % (address, ip) for address, ip in results.iteritems()))
    outfile.close()

if __name__ == '__main__':
    main()

同時に開始するスレッドが多すぎることが判明した場合は、バッチで実行するか、キューを使用してみてください (例については、http://www.ibm.com/developerworks/aix/library/au-threadingpython/を参照してください)。 )

于 2010-06-22T11:43:55.617 に答える
0

サーバーの更新に対応するには、15 分以内に実行する必要があります。スクリプトの実行に 15 分かかりますか? 15分かからなければ完成!

パフォーマンスを向上させるために、以前の実行からのキャッシュと差分を調査します。

于 2010-06-22T03:34:21.380 に答える
0

dig別のプロセスを呼び出すと比較的時間がかかる可能性があるため、に委任するのではなく、純粋な Python ライブラリを使用して DNS クエリを実行することを検討します。(もちろん、インターネットで何かを調べるのも比較的時間がかかるため、マルチスレッドについて gilesc が言ったことは今でも当てはまります) python dnsを Google で検索すると、開始するためのいくつかのオプションが得られます。

于 2010-06-22T01:41:22.877 に答える