2

私は、pythonを使ってAppengineの基本的な写真アルバムを作成しています。27次のメソッドを使って、特定の "冒険"と一致するデータの詳細を取得します。私はページ分割に限界とオフセットを使用していますが、非常に非効率です。 5ページ(1ページに5枚の写真)の閲覧後、私はすでにDatastore Small Operationsの16%を使用しています。興味深いことに、データストアの読み取り操作の1%しか使用していません。これをデータストアの小規模な操作に効率的にするにはどうすればよいのですか。appengineでデータストアの小さな操作を少なくする

def grab_images(adventure, the_offset=0, the_limit = 10): 
    logging.info("grab_images") 
    the_photos = None 
    the_photos = PhotosModel.all().filter("adventure =", adventure) 
    total_number_of_photos = the_photos.count() 
    all_photos = the_photos.fetch(limit = the_limit, offset = the_offset) 
    total_number_of_pages = total_number_of_photos/the_limit 
    all_photo_keys = [] 
    for photo in all_photos: 
     all_photo_keys.append(str(photo.blob_key.key())) 
    return all_photo_keys, total_number_of_photos, total_number_of_pages 

答えて

6

いくつかのこと:

  1. あなたがするたびに呼び出さカウントする必要はありません、あなたは
  2. 同じことが、なぜあなたはすべての時間を照会している、クエリに行き、それをキャッシュすることができますか?キャッシュする。
  3. ページをキャッシュして、毎回ページごとのデータを計算するべきではありません。
  4. blob_keyだけが必要ですが、写真エンティティ全体が読み込まれているので、すべての写真属性を読み込む必要はありません。

つべこべ:データを配信するためにオフセットする前に、それはすべてのレコードを通過すると、あなたがページングを扱うあなたがthe_photosを必要としない=なし

+1

私は、blob_keyがReferencePropertyではなく実際のキー(文字列)であるように、キャッシュを使いやすくし、PhotosModelを変更しました。これだけで、小さなデータストアクエリの数が大幅に減少しました – user714852

+0

@ user714852 cool! –

1

方法は非効率的です。 Google http://code.google.com/appengine/articles/paging.htmlで説明されているブックマーク方法を使用してページングメカニズムを構築することを検討する必要があります。

この方法を使用すると、各ページに必要な項目だけを表示できます。私はまた、Shayによって提案されたように、あなたが適切にキャッシュすることを強くお勧めします。

0

新しいNDB APIに移行することをお勧めします。先物、キャッシュ、自動出金を使用すると、多くの手助けをすることができます。 Explicitは暗黙的より優れていますが、NDBの詳細の管理は、コードをよりシンプルで読みやすくします。

ところで、あなたはappstatsを使用して、リクエストがサーバーリソースをどのように使用しているのかを確認しようとしましたか?

+0

私はNDB APIについて簡単に見てきましたが、どこでも大きなベータ版のサインが少し怖かったです。私はすでにpython27を使用していますが、これはまさにプロダクションの準備ができていないため、一度に1つのベータ版を使用すれば、私のアプリは少し危険です。 – user714852

+0

良い点。私はアプリを2.7に自分自身で移動させるのにかなりの負担を負っているようです(問題ではなく、マイグレーションではありません): -/ そして私は2.7から始めるのが賢明だと同意します。今のところ。 – rbanffy

関連する問題