4

現在、Web クローラーを作成しています (Python フレームワークのScrapyを使用)。
最近、一時停止/再開システムを実装する必要がありました。
私が実装したソリューションは最も単純なもので、基本的には、リンクがスケジュールされたときにリンクを保存し、実際にリンクが「処理済み」としてマークされます。
したがって、スパイダーを再開するときにこれらのリンクを取得できます (明らかに、URL、深さの値、リンクが属するドメインなどよりも少し多くの情報が保存されています...)。これまでのところ、すべてがうまく機能しています。

現在、私は mysql テーブルを使用してこれらのストレージ アクションを処理しており、主に高速なプロトタイピングを目的としています。

ここで利用できるオプションはデータベースだけではないと思うので、これを最適化する方法を知りたいと思います。最適化とは、非常にシンプルで軽量なシステムを使用しながら、短時間で書き込まれた大量のデータを処理できることを意味します

今のところ、数十のドメインのクロールを処理できるはずです。つまり、1 秒間に数千のリンクを保存することになります...

提案を事前にありがとう

4

2 に答える 2

4

物事を永続化する最も速い方法は、通常、ログに追加することです。このような完全にシーケンシャルなアクセスパターンは、通常、ストレージの時間コストの最大部分であるディスクシークを最小限に抑えます。再起動すると、ログを再度読み取り、最初にログに追加していたときにその場で構築していたメモリ構造を再構築します。

特定のアプリケーションは、必ずしも100%の信頼性を必要としないため、さらに最適化できます。突然のクラッシュが原因でいくつかのエントリを書き忘れた場合は、もう一度クロールするだけです。したがって、ログファイルはバッファリングでき、執拗にfsyncする必要はありません。

検索構造もメモリに快適に収まると思います(数十のサイトの場合は、すべてのURLを設定しておくことができ、ブルームフィルターなどの凝ったものは必要ありません)。そうでない場合は、最近のエントリのセットのみをメモリに保持し、そのセットを定期的にディスクにダンプする必要がある場合があります(たとえば、すべてのエントリをBerkeley DBファイルにマージします)。しかし、これらのオプションについては、必要になるとは思われないので、詳細については説明しません。

于 2009-11-13T15:39:50.487 に答える
2

PyCon 2009 で、Bill Gribble による データ分析アプリケーションの Precise state recovery と restartという興味深い話がありました。

アプリケーションの状態を保存するもう 1 つの簡単な方法は、pickleを使用してアプリケーションの状態をディスクにシリアル化することです。

于 2009-11-13T14:43:54.807 に答える