地理空間データにKey-Valueストアを使用する方法はありますか?


26

過去に多くのリレーショナルデータベースを使用しましたが、すべてのNoSQLデータベースについても読んでおり、Key-Valueストアは興味深いものに見えます。

ジオメトリオブジェクトを格納するときは、主に5つのインデックス付き列ID、MIN_X、MAX_X、MIN_Y、およびMAX_Yを使用します(XとYはマップ投影にあります)。他のデータのインデックスは必要ありません。

指定した場所(マップの四角形)でオブジェクトを検索するにはX値とY値が必要です。指定したオブジェクトを更新する場合は、ID値が必要です。

これにKey-Valueストアを使用する方法はありますか?

回答:


18

Google AppEngineを使用して空間/属性クエリを実行します。主な問題(初日から)は、任意のサイズのライン/ポリゴンの大きなセットをインデックスする方法です。ポイントデータはそれほど難しくありません(ジオハッシュ、ジオモデルなどを参照)が、ランダムにクラスター化された小さな/大きなポリゴンのセットは常に問題でした(そして場合によっては依然としてそうです)

GAEで空間インデックスのいくつかの異なるバージョンを試しましたが、ほとんどは以下の2つのバリエーションです。SQLデータベースほど高速ではなく、すべてに賛否両論があります。ただし、ほとんどのインターネットベースのマッピングアプリでは、トレードオフが妥当と思われます。また、以下の2つをインメモリジオメトリカリング(JTSなどを介して)と組み合わせて、最終的な検索パラメーターに適合しない機能を削除する必要があります。そして最後に、GAE固有の機能に依存していますが、他のアーキテクチャにも適用できると確信しています(または、TyphoonAEを使用してLinuxクラスター、ec2などで実行できます)

グリッド -特定の領域のすべての機能を既知のグリッドインデックスにパックします。グリッドに小さな空間インデックスを配置して、グリッドに含まれる一連の機能をすばやくナビゲートします。ほとんどのクエリでは、正確なグリッドの命名規則とK / Vエンティティ(クエリではなく取得)との関係を知っているので、ほんの少しのグリッドを引くだけで済みます。

長所 -非常に高速で、実装が簡単で、メモリフットプリントがありません。

短所 -前処理が必要、ユーザーはグリッドサイズを決定する必要があり、大きなジオムは複数のグリッドで共有され、クラスタリングによりグリッドが過負荷になる可能性があり、シリアル化/逆シリアル化のコストが問題になる可能性があります

QuadKeysこれは現在の実装です。基本的にはグリッドと同じですが、グリッドレベルが設定されていない点が異なります。機能が追加されると、境界が完全に含まれるクワッドキーグリッドによってインデックス付けされます(または、場合によっては、1つのクワッドキーが使用できないときに2つに分割され、日付変更線が考えられます)。qkが見つかったら、それを最大数の小さなqkに分割し、フィーチャのよりきめの細かい表現を提供します。次に、その機能へのポインター/ bboxは、クエリ可能な軽量のグリッドインデックス(機能のグループ)にパックされます(元のデザインは機能を直接照会しましたが、結果セットが大きい場合、これは遅すぎる/ CPUに負荷がかかります)

Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png Polygon Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png

上記で使用されるクワッドキーの命名規則はよく知られており、さらに重要なことには、局所性を保持する傾向があります(ここで詳しく説明します

上記のポリゴンは次のようになります:0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 032010101313003 032010101313012 032010101313013 03201010131312 03201010131313 032010101313102 ...

クエリの境界が十分に小さい場合は、qkを介して直接フェッチできます。これは、GAE datatoreに対する単一のバッチrpc呼び出しのみであるため、最適です。境界が十分に大きく、可能なqks(> 1000)が多すぎる場合は、代わりにフィルターを使用してクエリを実行できます(例:qk> = 0320101013およびqk <= 0320101013 + \ ufffd)。クアッドキーの命名規則に加えて、GAEが文字列にインデックスを付ける方法により、上記のクエリはそのqk値を下回る既存のグリッドのみを取得できます。

他にも注意点とパフォーマンスの問題がありますが、一般的には、クワッドキーでクエリを実行して実行可能にする機能

例-米国の郡のクエリ:geojson

長所 -かなり高速、グリッドサイズの設定なし、メモリフットプリントなし、過密グリッドなし

短所 -前処理が必要、いくつかのシナリオでオーバーフェッチが発生する可能性があり、極性データなし

空間充填曲線 - 今年のGoogle I / O でのAlfredのNextGen Queriesトークご覧ください。新しいMultiQuery演算子(並列で実行)と共に汎用の空間/時間充填曲線を含めることで、いくつかの本当にクールな空間クエリが可能になります。従来のSQLパフォーマンスに勝るでしょうか?言うのは難しいですが、本当にうまくスケーリングするはずです。そして、あらゆる形状/サイズの常時オンのモバイルデバイスがサイト/サービスへのトラフィックを劇的に増加させる未来に急速に近づいています。

最後に、NoSQLよりもSQLを選択する前に、問題のあるドメインをよく見る必要があることに同意します。私たちの場合、GAEの価格設定モデルが本当に好きだったので、選択の余地はありませんでしたが、スケーリングする必要がない場合は、時間を節約して、標準のSQLデータベースを使用してください


GAEについて言及していますが、どのデータベースを使用していますか?いくつかあります:cloud.google.com/products/storage
Don McCurdy

11

GeoCouchのことを聞いたことがあります。GeoCouchは、位置情報ベースのデータ用のCouchDBの実装です。また、MongoDBには地理空間インデックス機能があると思います。


はい、両方とも可能です。SimpleGeoはCassandraの空間拡張を構築しています。ヴォルデモートまたはMemCacheで何も聞いていません
-TheSteve0

ああ、SimpleGeoがやっていることが大好きです。私はjeしていて、彼らのために働きたいです!
JoshFinnie

8

これは主にアルゴリズムに関する質問です。スタックオーバーフローは、それを尋ねるのに適した場所かもしれません。

いずれにせよ、あなたの直接の質問に対する答えは「はい、kvpストアを使用して空間データを表すことができます」です。しかし、より良い質問は、「空間データを表すためにkvpストアを使用する必要がありますか?」

その質問への答えは(他の多くの人と同様に)「依存する」です。それは、規模、(トランザクション)作業負荷、データの性質、および自由に使用できる計算インフラストラクチャに依存します。

kvpストアのオーバーヘッドは低く、大量の挿入および更新の並列処理のスループットを向上させることができます。ただし、空間検索(長方形内のすべてのオブジェクトを検索)を実行するのはそれほど高速ではありません。そのためには、Rツリーのような空間インデックスが必要です。

ただし、データボリュームが非常に大きく、コンピューターの巨大なクラスターがある場合は、kvpインデックスを使用すると、パフォーマンス上の利点が得られます。実際に確実に知る唯一の方法は、実際のデータを使用してパフォーマンス測定を行い、遭遇することが予想されるパターンにアクセスすることです。

更新

ここにもう少し情報があります。KVPストアを使用して、空間検索を実行できます。問題は、遅いことです。理由を確認するには、次のようなものを検討してください。

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

*と#は、11x11グリッドにレイアウトされたオブジェクトを表し、原点は左上隅にあります。長方形(4,4)-(7,7)内のオブジェクトの検索を想像してください。これですべての「#」が見つかるはずです。KVPストアのインデックスを表すためにb +ツリーを使用していると仮定すると、「X」インデックスまたは「Y」インデックスのいずれかを使用して結果を見つけることができます。この場合、どちらでもかまいません。議論のために、xインデックスを使用します。Xインデックスでlog(n)ルックアップを実行して、X値が「4」の最初のノードを見つけ、7より大きい値を持つノードが見つかるまでb +ツリーリーフノードを反復処理します。 xインデックスを反復処理すると、必要なyの範囲外にあるものはすべて拒否されます。

これは遅いです。同じ密度、たとえば100 K * 100 Kの大きなグリッドでそれを想像してください。9つのレコードだけを見つけるには、「300、000」のインデックスエントリをスキャンする必要があります。ただし、適切にバランスのとれたRツリーを使用する場合、インデックスルックアップはおそらく約90レコード程度をスキャンするだけで済みます。それは大きな違いです。

ただし、問題は、Rツリーのバランスを保つのに費用がかかることです。これが、答えが「依存する」である理由であり、「これをすべきか」という質問が「どうやってそれをするか」よりもはるかに重要である理由です。

レコードを頻繁に挿入および削除し、ほとんどが「オブジェクトID」ルックアップを行い、「空間」ルックアップを頻繁に行わない場合、KVPインデックスを使用すると、実際にシステムを使用したいパフォーマンスが向上します。ただし、挿入または削除の頻度は低いが、空間検索を頻繁に行う場合は、Rツリーを使用する必要があります。


「はい、できます」のような答えは受け入れません。HOWを知りたいからです。そして、「SHOULD I ..」はあなたが言ったように「依存する」ので、より良い質問ではありません。
ジョナス

1
私はあなたに反対しなければなりません。有用なシステムを構築したい場合、または同様のシステムを構築している他の人々のためにインターネット上で有用な参照を残したい場合、「方法」よりも「私」の方がはるかに重要です。しかし、役立つように、答えを編集して、その方法に関する情報を提供しました。
スコットウィスニエ

@Jonasあなたが得た「アドバイス」の答えは、あなたが質問をした方法によるものだと思います:「しかし、私はすべてのNoSQLデータベースについても読んでおり、Key-Valueストアは面白そうです。」これには、問題を探すソリューションのすべての特徴があります。
ジェイソンバーチ

NoSQLは問題を解決しますが、十分な規模で作業していないため、実際には誰も抱えていない問題です。残念なことに、私たち自身のシステムは、物事の壮大な計画において実際よりも大きいと考えるのは常に素晴らしいことです。:)
ジェームズライアン


1

ほとんどの場合、キー/値またはキー/値/タイプのストレージからよりも、リレーショナルデータストレージからより多くのユーティリティを取得します。この種のデータスキームの効率的なクエリとレポート作成にはかなりの複雑さがあります。

私のアドバイスは、使用方法を検討する前に、スケールに実際にNoSQLが必要かどうかを厳密に評価することです。


1
以下は、ポイントがジオメトリの内側か外側かを計算する必要がある場合に発生する可能性のある問題の例(およびその解決策)です。code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
ジョンブリングハースト

@Jonさん、回答として追加した方が良いでしょう。そうすれば、それはそれ自体で立つことができ、人々がそれがメリットがあると思うなら、あなたはそれを信用するでしょう!
ジェイソンバーチ




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.