1

web2py と Flex フロント エンドを使用して、GAE でスポーツ トーナメントを検索するためのディレクトリを作成しています。ユーザーは、一連の選択肢から場所、半径、および最大日付を選択します。このクエリの基本バージョンを実装しましたが、非効率的で遅いです。これを改善できるとわかっている方法の 1 つは、オブジェクトをまとめて一括クエリにするために使用している多くの個々のクエリを凝縮することです。私はそれが可能であることを学びました。しかし、memcache を利用したより広範な再設計も考えています。

主な問題は、GAE が 1 つのクエリで複数の数値比較ステートメント (<、<=、>=、>) を許可しないため、場所でデータストアをクエリできないことです。私はすでに日付に 1 つを使用していますが、緯度と経度の両方を確認するには 2 つ必要なので、それはありません。現在、私のアルゴリズムは次のようになっています。

1.) 日付によるクエリと選択

2.) geopy の距離モジュールの目的地関数を使用して、指定された距離の最大および最小の緯度と経度を見つけます。

3.) 結果をループし、最大/最小外の緯度/経度ですべてを削除します

4.) もう一度ループし、距離関数を使用して正確な距離を確認します。これは、ステップ 2 で半径の外側にいくつかの領域が含まれるためです。指定された距離外の結果を削除します (この 2/3/4 の組み合わせは非効率ですか?)

5.) 多対多のリストを組み立ててオブジェクトにアタッチします (ここで一括操作に切り替える必要があります)

6.) クライアントに戻る

memcache を使用するための私の計画は次のとおりです。一般的に memcache やサーバー キャッシングの経験がないので、これについて左のフィールドから抜け出している場合はお知らせください。

-すべてのデータを表す「地理オブジェクト」で満たされたリストをキャッシュに保持します。これらには、緯度、経度、event_id、event_type (トーナメントを超えた拡張を見越して)、および start_date の 5 つのプロパティがあります。このリストは日付順にソートされます。

-アプリが使用するすべての日付範囲 (来週、2 週間、1 か月、3 か月、6 か月、1 年、2 年) のキャッシュ内の開始インデックスと終了インデックスを表すポインターの辞書もキャッシュに保持します。

- 毎日午前 12 時にポインターを更新するスケジュールされたタスクを用意します。

-キャッシュとデータストアに新しい挿入を追加します。ポインターを更新します。

この設計を使用すると、アルゴリズムは次のようになります。

1.) ポインターを使用して、指定された日付に基づいてリストの適切なチャンクを切り取ります。

2-4.) ジオ オブジェクトを除いて、上記のアルゴリズムと同じ

5.) 一括操作を使用して、残りのジオ オブジェクトの event_id を使用して完全なトーナメントを選択します。

6.) 多対多を組み立てる

7.) クライアントに戻る

このアプローチについての考えは?読んでくれてありがとう、そしてあなたが与えることができるアドバイスに感謝します。

-デーン

4

2 に答える 2

2

GeoModelは私が見つけた最高のものです。私の GAEアプリがどのように地理空間クエリを返すか見てみましょう。たとえば、インドの http クエリは、ジオモデル ライブラリを使用してオプションの cc (国コード) を使用します。lat=20.2095231&lon=79.560344&cc=IN

于 2010-03-28T21:48:47.803 に答える
1

に興味があるかもしれませんgeohash。これにより、次のような不等式クエリを実行できます。

SELECT 緯度、経度、タイトル FROM myMarkers WHERE geohash >= :sw_geohash AND geohash <= :ne_geohash

今月の Google App Engine App Engine コミュニティ アップデートブログ投稿で紹介されたこの素晴らしい記事をご覧ください。

提案された設計に関するメモとして、Memcache 内のエンティティはメモリ内に留まる保証がないこと、およびエンティティを「日付順に並べ替える」ことができないことを忘れないでください。

于 2010-03-29T12:29:08.183 に答える