0

私は、いくつかのことをしなければならないスクリプト (またはもっと良いのはデーモン) を書くタスクを与えられています:

  1. 複数の入力 xml フィードから最新のデータをクロールします。当面は15~20フィード程度ですが、将来的には50フィードまで増える可能性があると思います。フィードのサイズは 500 KB から 5 MB の間で変動します (10 MB を超えることはほとんどありません)。フィードは標準化された形式ではないため、データが単一の共通形式に統合されるように、特定のソースからのフィードごとにフィード パーサーが必要です。
  2. フィードから抽出されたデータのすべての単一ユニットが引き続き利用できるように、データをデータベースに保存します。
  3. データは時間とともに変化するため (たとえば、情報は少なくとも 1 時間に 1 回更新されます)、変更されたデータのアーカイブを保持する必要があります。

この場合、管理が難しいことが証明されているもう 1 つのこと (私はすでにいくつかのソリューションをハックしました) は、ステップ 2 でデータベースがクロールに遅くなり始めることです。これは、複数のテーブルにデータを挿入する SQL クエリの量が原因で、データベースに依存するシステムの残りの部分に影響します (これは、複数のサイトがホストされている専用サーバーです)。そして、ステップ3にさえ到達できませんでした...

この問題にどのように取り組むべきかについてのヒントはありますか? 注意すべき注意点は?この問題を解決するのに役立つものは何でも大歓迎です。

ありがとう!

4

1 に答える 1

0

私のアイデアのいくつか:

  1. データベースがトランザクションをサポートしている場合、データベース トランザクションを使用する賢い方法を考案できます。私はデータベース トランザクションで実験しただけですが、挿入速度を最大 40% 向上させることができ (mysql.com)、テーブルをロックしないと言われています。

  2. SQL に適した形式であっても、一時ファイルにデータを追加し、データをデータベースに一度にロードできます。LOAD DATA INFILE を使用すると、通常は 20 倍高速になります (mysql)。以前は 100 万を超えるエントリをすばやく挿入していましたが、非常に高速でした。

  3. ある種の待ち行列システムをセットアップします。

  4. 各クエリでスリープまたは待機を設定します (Python では、time.sleep(1) はプロセスを 1 秒待機させます)

どのデータベースを使用しているか正確にはわかりませんが、挿入を最適化するためのヒントをいくつか示します:
http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

于 2010-08-27T18:18:22.480 に答える