私は、クローラが取ったパスのマップを作成する最終的な目標を持つWebクローラを作成しています。他のどのクローラーがページをプルダウンするのかという手掛かりはありませんが、私の時計は約2,000ページ/分です。効率的な "in"の代替
クローラは、深さが15に制限されている再帰的なバックトラッキングアルゴリズムで動作します。 さらに、クローラが無限にページを再訪するのを防ぐため、訪問した各ページのURLをリストに格納し、次の候補URLのリストをチェックします。
for href in tempUrl:
...
if href not in urls:
collect(href,parent,depth+1)
この方法は、約300,000ページをプルダウンするまでに問題になるようです。この時点で、クローラは平均して毎分500ページのクロッキングを行っています。
私の質問は、効率を高めながら同じ機能を実現するもう1つの方法です。
私は、各エントリのサイズを小さくすると役立つかもしれないと思ったので、URL全体を追加する代わりに、各URLの最初の2文字と最後の文字を文字列として追加します。しかし、これは役に立たなかった。
私はセットや何かでこれを行う方法がありますか?ヘルプ
編集用
ありがとう:注意点として、私のプログラムはまだマルチスレッドではありません。私はスレッド化について学ぶ前に、このボトルネックを解決する必要があると考えました。
私はリストと同じ方法でチェックしますか?このような単純な変更によってパフォーマンスが向上しますか? D: – danem
+1を試してみると、セット内の存在をチェックするのはO(1)iircでなければならず、リストからセットに切り替えることで既存のチェックをすばらしいスピードアップを見たことがあります – Davy8
@Pete、yes - メンバーシップのテストsetsとdictsはリストやタプルの中でO(1)であり、リスト/タプルの長さはO(n)です。したがって、長いリスト/タプルの場合、_huge_の違いが生じます。 (+1 btw。) – senderle