2009-08-03 3 views
3

背景の最初のビット:GeoModelは、App Engineアプリケーションに非常に基本的なジオスペースインデックスとクエリー機能を追加するライブラリです。それは、ジオハッシングと同様のアプローチです。 GeoModelの等価ロケーションハッシュは「geocell」と呼ばれます。App Engine:13 StringPropertysと1 StringListProperty(インデックス/ストレージとクエリのパフォーマンス)

現在、GeoModelライブラリは13個のプロパティ(location_geocell__n_、n = 1..13)を各位置認識エンティティに追加します。

location_geocell_1 = 'a' 
location_geocell_2 = 'a3' 
location_geocell_3 = 'a3f' 
... 

これは、空間クエリ中不等式フィルタを使用しないために必要とされる:例えば、エンティティは、次のようなプロパティ値を有することができます。

13プロパティアプローチの問題は、アプリケーションが実行したいジオクエリの場合、13の新しいインデックスを定義して構築する必要があるということです。これは間違いなくメンテナンスの手間であり、プロジェクトのデモアプリケーションを書き直しながら痛感しているだけです。これが私の最初の質問につながる:

QUESTION 1:インデックスあたりの重大なストレージ・オーバーヘッドがありますか?つまり、それぞれにn個のエンティティを持つ13個のインデックスがあるのに対し、13n個のエンティティを持つ1個のインデックスは、前者がストレージに関して後者よりずっと悪くなっていますか?

答えは(1)はいいえ、this articleであると思いますが、誰かが別の経験をしているかどうかを確認したいと思います。

さて、私はGeoModelライブラリを調整検討しているように代わりに13文字列プロパティの、一つだけStringListPropertyはすなわち、location_geocellsが呼び出されると思います。:

location_geocells = ['a', 'a3', 'a3f'] 

これはindex.yamlずっときれいになります。しかし、私は、パフォーマンスへの影響を質問します:

QUESTION 2:私は13の文字列プロパティから1 StringListPropertyに切り替えると、パフォーマンスの悪影響を受けることを照会します。私の現在のフィルタは、次のようになります。

query.filter('location_geocell_%d =' % len(search_cell), search_cell) 

と新しいフィルタは次のようになります。2番目のクエリが持っているのに対し、最初のクエリは、_N_実体の探索空間を持っていることを

query.filter('location_geocells =', search_cell) 

注意_13n_エンティティの検索スペース。

(2)の回答のようですが、両方ともthis blog postのヒントごとに6となりますが、もう一度、誰かがこれと実際に異なる体験をしているかどうかを確認したいと思います。

最後に、ストレージ利用率、クエリパフォーマンス、使いやすさ(特にw.r.t. index.yaml)を向上させるためのヒントやヒントがある場合は、教えてください。ソースはここgeomodel & geomodel.py

答えて

5

見つけることができますあなたは、有意なオーバーヘッドごとのインデックスがないことを正しいです - 一つの指標で13Nエントリは13のインデックス内のn個のエントリに多かれ少なかれ同等です。しかし、合計インデックス数は100ですが、これは利用可能なインデックスのかなりの部分を占めています。つまり、ListPropertyを使用することは、ユーザビリティとインデックス消費の観点からはるかに優れたアプローチです。あなたが想定しているように、両方のクエリが同じ数の行を返すと仮定すると、小さなインデックスとより大きなインデックスをクエリする間にパフォーマンスの違いはありません。

個別のプロパティを使用して考えることができる唯一の理由は、特定の詳細レベルでインデックスを作成する必要があることがわかっている場合ですが、追加する詳細のレベルを指定することで最初の場所のリスト。

いずれの場合でも、並べ替え順または不等式フィルタと一緒にジオセルプロパティを照会する場合は、索引のみが必要であることに注意してください。他のすべての場合は自動索引付けで十分です。

+0

さまざまなプロパティの種類とインデックス行の保存容量の詳細:http://code.google.com/appengine/articles/storage_breakdown.html – ryan

1

最後に、誰もがストレージの利用率を向上させることができ、他の提案やヒントを持っている場合、クエリのパフォーマンスおよび/または使用の容易さ

StringListpropertyがために行くための方法です実際の使用では、既存のStringListを所有するものにジオセルを追加して、複数のプロパティに対してクエリを行うことができます。

あなたは低レベルAPIを提供していたのであれば、それはbill katz's

def point2StringList(Point, stub="blah"): 
    ..... 
    return ["blah_1:a", "blah_2":"a3", "blah_3":"a3f" ....] 

def boundingbox2Wheresnippet(Box, stringlist="words", stub="blah"): 
    ..... 
    return "words='%s_3:a3f' AND words='%s_3:b4g' ..." %(stub) 

etc. 
+0

これは大きなポイントです。ライブラリはSearchableModelとBill Katzの両方のメソッドと互換性があることがわかります。 IIRCでは、フルテキストでフィルタリングされたクエリを検索することはできませんでした。両方の方法との互換性は重要です。 –

0

のようなフルテキスト検索の実装で動作することができます(/人間読みやすくするための六角でエンコードされたので、あなたは、13個の指標になってしまったように見えますマップレベル?)。 バイト(ByteString)の完全な可能性を利用していた場合は、1文字(バイト)あたり16セルではなく、256セルを使用していました。そこでは、同じ精度の指標の数がはるかに少なくなります。

ByteStringは、strの単なるサブクラスであり、長さが500バイト未満の場合も同様にインデックスされます。

ただし、レベル数は低くなる可能性があります。私には4つまたは5つのレベルは、ほとんどの状況では「地球」のために十分に実用的です。より大きな惑星の場合、または各砂粒子の目録を作成する場合、使用されるエンコーディングに関係なく、より多くの部門を導入する必要があります。どちらの場合でも、ByteStringは16進符号化より優れています。インデックス作成を減らすのに役立ちます実質的にです。 40億(EST)低レベルの細胞を表すため

  • 、我々は必要なすべては、4バイトまたは単に4指標あります。 (基本的なコンピュータアーチまたはメモリアドレッシングから)。
  • これを表すには、 16進数または16インデックスが必要です。

私は間違っている可能性があります。マップのズームレベルと一致するインデックスレベルの数が重要な場合があります。私を修正してください。

または、階層が下がるにつれて、より大きいセル(16)は少ないが、それ以上(128,256)のソリューションです。 考えていますか?

例えば:

  • [0-15]、[0-31]、[0-63] [0-127]、[0-255]はサイズでのlog2の減少で5つのインデックスを有する1G低レベルの細胞が得られます。
  • [0-15] [0-255] [0-255] [0-255]は、5つのインデックスを持つ16G低レベルセルを示しています。
関連する問題