0

私は、ライブ Twitter フィードを取得し、そこからレコードを PostgreSQL データベースに保存する必要があるプロジェクトに取り組んでいます。このプロジェクトでは、ツイートの位置データを PostGIS で検索できるように保存する必要があります。Twitter フィードを取得するために perl スクリプトを使用しています (AnyEvent::Twitter::Stream と Twitter API を使用)。5000 ツイートごとに、スクリプト fork() と子プロセスが SQL を発行して行を挿入します。挿入を高速化するために AutoCommit => 0 を使用しています。

問題は、子プロセスが次の 5000 件のツイートが入る前に 5000 件のツイートの保存を完了していないため、多数の postgres プロセスが発生することです。次のプロセスが開始される前に子プロセスが終了できるように、データベースの挿入を高速化する方法を理解する必要があります。

子プロセスが (各ツイートに対して) 現在実行しているタスクは次のとおりです。

  • ST_GeomFromEWKT を使用して緯度/経度データを GIS 座標に変換し、ツイート テーブルにレコードを挿入します。
  • ツイートの作成者とツイートで言及されているユーザーが users テーブルにあることを確認します
  • 関連するテーブルにユーザーとハッシュタグの言及を挿入する

速度の診断またはプロセスの高速化に関するアドバイスは、最も役に立ちます。これは最終的にリアルタイムで機能する必要があるため、一時テーブルとテキスト ファイルは適切なオプションではありません。サーバーは、8G の RAM を搭載した Debian を実行するデュアル Xeon HP サーバーです。

4

2 に答える 2

4

postgres docs には、select 句からの挿入を誤用して挿入を高速化することに関するコメントがあります。これは大きな違いのようですが、試してみましたか?

INSERT を高速化するための役立つヒント: INSERT INTO tbl <query> 構文を使用して、挿入をまとめてバッチ処理することにより、挿入の速度を加速できます。例えば...

INSERT INTO my_table SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 3, 'c' UNION ...

INSERT ステートメントごとに多くの値のセットをまとめて処理し、トランザクションごとに複数の INSERT ステートメントをまとめて処理すると、挿入パフォーマンスが大幅に向上します。この手法を使用して 100 (小さい) をバッチ処理することにより、PostgreSQL 8.1 / Win2K インストールでほぼ 8 倍高速な挿入を達成することができました。

そうしないと、postgres を必要な速度まで上げられない場合は、HP ボックスで IO パフォーマンスを確認できます。

また、挿入後に更新するインデックスが多数あるかどうかを確認します。多くの制約 (FK 制約) に別れを告げる必要さえあるかもしれません。これにより、任意の順序でレコードを挿入できるようになり、ツイートを挿入する前にユーザーが作成されるのを待つ必要がなくなります。

ツイートを収集している間にデータベース内のユーザーを確認できる可能性があるかどうかも確認します。最後になりましたが、5000 件のツイートのバッチを挿入するキューを実装する必要があります。単純にデータベースに送信するのではありません。

于 2013-11-08T23:00:31.897 に答える