2012-03-06 16 views
1

Google App Engineにマップタイルエンジンを実装しようとしています。Google App Engineで効率的なマップタイルエンジンを実装するにはどうすればよいですか?

マップデータは、データベース、データストア(ビッグテーブル)に格納されます。問題は、データベース内の同じ行セットに基づいて20のタイルを描画するために、20回のリクエストがほぼ同時に発生する可能性があることです。

20個のリクエストが入ってくるので、リクエストごとにデータベースから読み込むコードを書けば、データベースから同じ20個の読み込みが行われます。それぞれのタイルイメージ出力ごとに読み込まれます。各読取りは同じ問合せであるため、同じ問合せを20回実行するのは意味がありません。実際、これは非常に非効率的です。

これを行うには誰でも良い方法を提案できますか?

私がmemcacheを使用する場合、データをmemcacheに入れる必要がありますが、同時にデータの要求が20回ある場合、nieveの実装を行うと20プロセスがmemcacheに書き込みを行い、彼らはすべて同時に並行しているからです。

私はGoogle App EngineのGoogle Goバージョン1ベータ版でプログラミングしています。より完全なので、ここではPythonのドキュメントを参照しています。

参考文献:私は明確にするためhttp://leaflet.cloudmade.com/


マップタイルを示すために使用しています

Googleのデータストアhttp://code.google.com/appengine/docs/python/datastore/overview.html

リーフレットJS。

データベース内のデータからタイルイメージを生成します。つまり、データのデータベースにクエリします(これはタイルイメージではありません)。次に、データをイメージに描画し、イメージをJPEGとしてレンダリングします。 GAEは、サーバ側http://blog.golang.org/2011/12/from-zero-to-go-launching-on-google.html

答えて

1

にいくつかのことを、画像を描画するための効率的であるとして頭に浮かぶ:

  1. あなたはタイルを照会するにはどうすればよいですか?クエリよりも効率的なKey.get()を使用してタイルを取得できるはずです
  2. リクエストの数を減らそうとすると、レベルを使用してマップを取得する要求が4回程度減ります。
+0

私はデータベースのデータからタイルイメージを生成します。つまり、データをデータベースに照会して、データをイメージに描画し、イメージをJPEGとしてレンダリングします。 GAEはサーバー側で画像を描画するのに効率的ですhttp://blog.golang.org/2011/12/from-zero-to-go-launching-on-google.html – Phil

+0

@Phil私はPNGがあなたに地図画像データのよりよい結果(品質/圧縮)。 –

+0

@ Philまた、イメージクライアント側をダウンロードする方が良いでしょうか?これは、すべての地図サービス(Google/Bing/Quest)がそれをやっているところです。 –

2
  1. あなたはすなわちget()代わりのquery()を使用して、代わりに彼らのために照会のキー経由でそれらを見つけることができるようにタイルエンティティを整理します。いくつかの基準に基づいてタイルを特定する場合は、基準を組み合わせて自然IDを作成します。例えば。画像の中で縦と横の位置に基づいてタイルを見つけたら、naturalID = imageID + verticalID + horizo​​ntalID(見やすくするためにセパレータを追加することもできます)。

  2. 一意のIDを取得したら、それを使用してMemcacheにタイルを保存することができます。

  3. タイルが不変(一度作成されると、その内容は変更されません)の場合、グローバルマップのインスタンス内にキャッシュすることもできます。

編集:私はちょうどあなたのpythonを使用して実現して削除客観参照。 EDIT2:私はGoogleのApp Engineはそれをしないかは知らないが、同じクエリが2回連続尋ね入った場合、それは結果を使用するようにMySQLがクエリキャッシュを持っている追加ポイント3.

2

最初のものから2番目のものに答える。 Googleは物事を知っているので、うまくいけばそれも同様です。

同じ結果を返すだけでなく、クエリがまったく同じであることを確認する必要があることが1つあります。たとえば、tileX = 1、tileY = 1 とQUERY2はmytableはどこからtileX = 1、tileY = 2

LAT、LNGを選択 なるようにmytableはFROM LNG、Query1をは はLAT SELECTにしたくありません私はポリゴンの塊でタイルを作っています。タイミングと最適化を行うと、WHERE句よりもPHPで必要としない値をすべて返すほうが速いことがわかりましたSQLに渡す。 MySQLサーバーが効果的にキャッシュすることができないように、WHERE句が各タイルごとに異なるため、部分的にはそうだと思います。

関連する問題