0

私は現在、回答した質問に基づいてユーザーを照合する Web アプリケーションを Ruby on Rails で作成しています。次に、ユーザーの範囲を検索できます。システムは、その範囲に該当するすべてのユーザーと検索者を照合し、順序付けられたリストでそれらを返し、最も一致度の高いものが最初に来るようにします。

問題は、この操作が非常に重いワークロードであるため、その場で実行できるとは思えないことです。私はすでに SQL を最大限に最適化し、2 人のユーザー (ローカル マシン) 間の一致率を計算するのに約 8.2 ミリ秒かかる 1 つの SQL クエリで完全に一致するアルゴリズムを実現しました。問題は、検索されたユーザーが 5000 人いる場合、Rails はこのユーザーの配列を取得し、それらを繰り返し処理して、このクエリを 5000 回実行します。私のローカル マシンでは約 50 秒かかります。PostgresSQL に移行してこれをストアド プロシージャにすると、これを減らすことができますか?

私の質問は、ユーザーが検索を押したときに結果が表示されるまでに数秒しかかからないように、バックグラウンドプロセスやキャッシュなど、どのような方法がありますか? または、これはこの規模では不可能であり、一致を事前に計算して NoSQL などに保存する必要があります。5 万人のユーザーの場合、既に 25 億行あるからです。

4

1 に答える 1

2
  1. 1 つの方法は、1 つの SQL クエリを使用することです。現在、ユーザーごとに 1 つのクエリを実行していますが、全体で 1 つのクエリを意味します。したがって、1 つのクエリは、ユーザーをループするときに行っている作業を行うことになります。

  2. データベースキャッシュを実行し、各ユーザーの結果を毎日保存できます。これには NoSQL データ ストアは必要ありません。結果をデータベースに書き込むための cron ジョブだけが必要です。

  3. 結果を memcache に保存することもできます。memcache は Web アプリの Rails のインスタンス間で共有されるため、すべてのインスタンスで 1 つのコピーを使用できます。データを更新する必要があるかどうかをテストするために、有効期限条件をチェックするメソッドを介して結果にアクセスします。

于 2012-10-20T09:56:30.633 に答える