2

jQueryのオートコンプリートを使用してタグを検索するためのオートコンプリート機能のような「GoogleSuggest」を実装しています。

jQueryにWebサービスを提供して、ユーザーが入力した内容に基づいた提案のリストを提供する必要があります。Webサービスを実装する2つの方法があります。

1)すべてのタグをデータベースに保存し、ユーザー入力をプレフィックスとして使用してDBを検索するだけです。これは簡単ですが、レイテンシーが心配です。

2)処理中のトライを使用してすべてのタグを保存し、一致する結果を検索します。すべてが進行中であるため、レイテンシーがはるかに低くなると思います。しかし、いくつかの問題があります。-プロセスの起動時にトライを初期化するための良い方法は何ですか?おそらく、タグデータをDBに保存して取得し、プロセスを開始するときにそれらをトライに変換します。しかし、その方法はわかりません。Python/Djangoを使用しています。-ユーザーが新しいタグを作成する場合、新しいタグをトライに挿入する必要があります。しかし、5つのDjangoプロセスがあり、したがって5つの試行があるとしましょう。他の4つの試行にも、新しいタグを挿入する必要があることをどのように伝えるのでしょうか。-Djangoプロセスがスレッド化されるのでトライがスレッドセーフであることを確認する方法(私はmod_wsgiを使用しています)。または、Pythonのせいでthreadsaftyについて心配する必要はありませんか?s GIL?-タグの使用頻度をトライ内にも保存する方法はありますか?タグの文字列がいつ終了し、頻度がいつ開始するかを知るにはどうすればよいですか?apple213をトライに保存すると、頻度213の「apple」ですか、それとも頻度13の「apple2」ですか。

上記の問題に関するヘルプや、別のアプローチに関する提案をいただければ幸いです。

4

2 に答える 2

4

物事を測定する前にレイテンシーについて心配する必要はありません。一連の疑似タグを作成し、それらをDBに貼り付けて、一般的なクエリのレイテンシーを測定します。DBの設定によっては、レイテンシーは問題なく、無駄な心配を省くことができます。

ただし、常にスレッド化について心配する必要があります。GILは競合状態を解消しません(制御は、疑似コード命令の境界でスレッド間で切り替わる可能性があります。また、基になる拡張機能または組み込みのCコードが実行されている場合も同様です)。最初に使用しているDBAPIthreadsafetyモジュールの属性を確認し(PEP 249を参照)、次に適切にロックを使用する、DBインタラクション(Queue.Queueでリクエストを受信して​​結果を返す)を実行する専用スレッドの小さなプールを生成する必要がありますもう1つは、Pythonでのサウンドと簡単なスレッド化のための通常のアーキテクチャです)。

于 2009-06-22T03:16:08.153 に答える
1

最初のオプションを使用します。'KISS'-(Keep It Simple Stupid)。

少量のデータの場合、待ち時間はそれほど長くないはずです。名前検索でも同じようなことを実行すると、結果は数千行に非常にすばやく表示されます。

お役に立てば幸いです。

ジョシュ

于 2009-06-21T23:36:37.987 に答える