2

私は、Twitter APIを介して関連するTwitterフィードを読み取り、将来の分析のためにPostgreSQLデータベースに保存する研究プラットフォームに取り組んでいます。ミドルウェアはPerlであり、サーバーはDebianlinuxを実行する8GBのRAMを搭載したHPML310です。

問題は、Twitterフィードが非常に大きくなる可能性があり(1秒あたりのエントリ数が多い)、次のツイートを待つために戻る前に挿入を待つ余裕がないことです。つまり、私が行ったことは、fork()を使用して、各ツイートがデータベースとリスナーに挿入する新しいプロセスを取得し、すぐに戻って次のツイートを取得することです。ただし、これらの各プロセスはPostgreSQLバックエンドへの新しい接続を効果的に開くため、システムがTwitterフィードに追いつくことはありません。

私は、接続プールの提案を使用したり、必要に応じてハードウェアをアップグレードしてこれを機能させることを歓迎しますが、アドバイスをいただければ幸いです。これはRAMにバインドされている可能性がありますか、それともシステムを十分に高速化するために試みることができる構成またはソフトウェアのアプローチがありますか?

4

2 に答える 2

6

インサートごとに新しい接続を開いたり閉じたりすると、非常に時間がかかります。代わりに接続プールを使用する必要があります。新しいデータベース接続を作成することは、簡単なことではありません。

挿入ごとにaafork()を実行することも、おそらくそれほど良い考えではありません。挿入を処理してソケットでリッスンするプロセス、またはディレクトリなどをスキャンするプロセスと、挿入プロセスを通知する別のプロセス(従来の生産者/消費者パターン)を作成することはできません。または、ある種のメッセージキューを使用します(Perlを知らないので、そこでどのようなツールが利用できるかはわかりません)。

一括挿入を行う場合は、単一のトランザクションでそれらを行い、最後にコミットを送信します。各挿入をコミットしないでください。もう1つのオプションは、行をテキストファイルに書き込んでから、それを使用COPYしてデータベースに挿入することです(それより速くなることはありません)。

PostgreSQLサーバーを少し調整することもできます。システムがクラッシュした場合に一部のトランザクションを失う余裕がある場合は、synchronous_commitオフにすることをお勧めします。

テーブルをいつでも最初から再構築できる場合(たとえば、ツイートを再挿入することによって)、そのテーブルを「ログに記録されていない」テーブルにすることもできます。書き込みでは通常のテーブルよりも高速ですが、Postgresがきれいに表示されない場合、テーブル内のすべてのデータが失われます。

于 2013-01-10T21:20:30.390 に答える
0

COPYコマンドを使用します。1つのスクリプトがツイーターを読み取り、ディスク上のCSVファイルに文字列を追加します。ディスク上のCSVファイルを検索する他のスクリプトは、このファイルファイルの名前を変更し、このファイルからCOPYコマンドを開始しました。

于 2013-01-10T21:43:26.607 に答える