簡単に言うと、私の Web クローラーには 2 つの主な仕事があります。コレクターとクローラー、コレクターは各サイトのすべての URL アイテムを収集し、重複していない URL を保存します。クローラーはストレージから URL を取得し、必要なデータを抽出して保存します。
2台のマシン
ボット マシン -> 8 コア、物理 Linux OS (このマシンには VM はありません)
ストレージ マシン -> クラスタリングを備えた mySql (クラスタリング用の VM)、2 つのデータベース (url とデータ)。ポート 1 およびデータ ポート 2 の url データベース
目標: 100 のサイトをクロールし、ボトルネックの状況を減らします
最初のケース: コレクター *request(urllib) all sites 、各サイトの url アイテムを収集し、* ポート 1 のストレージ マシンへの URL が重複していない場合は挿入します。クローラー * ストレージ ポート 1 から URL を取得します。データを保存し、ポート 2 に戻します
これにより、リクエスト Web サイトと mySql 接続の両方で接続のボトルネックが発生します。
2 番目のケース: マシン全体に挿入する代わりに、Collector は自分のミニ データベース ファイル システムに URL を保存します。巨大なファイルを読み取る (os コマンド技術を使用する) 必要はなく、ファイルのヘッダーを *書き込み (追加) して *削除するだけです。
これにより、接続要求 Web サイトと I/O (読み取り、書き込み) のボトルネックが発生します (可能性があります)。
どちらの場合も、100 のサイトを収集してクロールするという CPU バウンドの原因があります。
私が聞いたように、I/O バウンドではマルチスレッドを使用し、CPU バウンドではマルチプロセッシングを使用します。
両方どうですか?ずんぐりした ?アイデアや提案はありますか?