在appengine中使用较少的数据存储小操作

时间:2012-02-15 09:45:24

标签: python google-app-engine google-cloud-datastore python-2.7

我正在使用python 27在appengine上组合一个基本的photoalbum。我已经编写了以下方法来从匹配特定“冒险”的数据存储中检索图像细节。我正在使用限制和偏移进行分页,但效率非常低。浏览5页(每页5张照片)后,我已经使用了16%的数据存储小型操作。有趣的是,我只使用了1%的数据存储读取操作。如何使数据存储小型操作更有效 - 我不确定这些是什么。

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

3 个答案:

答案 0 :(得分:6)

一些事情:

  1. 每次都不需要调用计数,可以缓存它
  2. 同样的查询,你为什么要一直查询?缓存它。
  3. 还要缓存页面,每次都不应该每页计算数据。
  4. 您只需要blob_key,但是您正在加载整个照片实体,尝试以不需要加载所有照片属性的方式对其进行建模。
  5. 挑剔:你不需要the_photos =无

答案 1 :(得分:1)

处理分页的方式效率很低,因为它通过偏移量之前的每个记录来传递数据。您应该考虑使用Google http://code.google.com/appengine/articles/paging.html描述的书签方法构建分页机制。

使用此方法,您只需浏览每个页面所需的项目。我还敦促你按照Shay的建议正确缓存,它既快又便宜。

答案 2 :(得分:0)

您可能需要考虑迁移到新的NDB API。它对期货,缓存和自动操作的使用可能对你有很大的帮助。显式优于隐式,但NDB对细节的管理使您的代码更简单,更易读。

BTW,您是否尝试使用appstats并查看您的请求如何使用服务器资源?