2

PostgresDBを使用したRoRアプリの検索機能を高速化しようとしています。現在どのように機能するかについては説明しません.../achieveアプローチを使用してください。

私はx個のレコード(潜在的にはかなりの数)を持っており、それぞれにFacebookID番号の配列が関連付けられています...潜在的に最大5kです。個人の友達IDのリストを使用してこれを検索し、検索配列とレコードの配列のいずれか(およびどの)との間に交差が存在するかどうかを確認する必要があります。

交差の結果を知る必要はありません。それが真か偽かだけです。

明るいアイデアはありますか?!

ありがとう!

4

2 に答える 2

3

データストアについて言及していないので、純粋なルビーを使用するだけです。

friend_ids = user.friend_ids
results = records.select { |record| !(record.friend_ids & friend_ids).empty? }

results少なくとも1つのfriend_idが共通しているすべてのレコードが含まれます。非常に多くのレコードをチェックする必要がある場合、これはそれほど速くはありません。

&はCで実装されている配列交差演算子です。ここで確認できます:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26

于 2012-05-04T06:59:34.397 に答える
1

@ctcherryの回答のおそらくより高速なバージョン、特にuser.friend_idsカーディナリティが高い場合:

require 'set'
user_friend_ids = Set[ user.friend_ids ]
results = records.select { |record|
  record.friend_ids.any? { |friend_id| user_friend_ids.include? friend_id }
}

これにより、user.freind_idsのテストセット(ハッシュ)が1回だけ作成されるため、@ TassによってリンクされたArray#memory_efficient_intersectよりもおそらく高速です。

これはデータベースでより高速に実行される可能性もありますが、モデルに関する詳細情報がなければ、アプローチを作成するのは困難です。

于 2012-05-04T21:44:41.990 に答える