【问题标题】:Using less datastore small operations in appengine在 appengine 中使用较少的数据存储小操作
【发布时间】:2012-03-06 15:44:51
【问题描述】:

我正在使用 python 27 在 appengine 上制作一个基本相册。我编写了以下方法来从与特定“冒险”匹配的数据存储中检索图像细节。我使用限制和偏移量进行分页,但是效率很低。浏览 5 页(每页 5 张照片)后,我已经使用了 16% 的 Datastore Small Operations。有趣的是,我只使用了 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

【问题讨论】:

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


    【解决方案1】:

    一些事情:

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

    挑剔:你不需要 the_photos = None

    【讨论】:

    • 我更好地利用了缓存并更改了 PhotosModel 使得 blob_key 是实际的键(字符串)而不是 ReferenceProperty。仅此一项就大大减少了小型数据存储查询的数量
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      顺便说一句,您是否尝试使用 appstats 并查看您的请求如何使用服务器资源?

      【讨论】:

      • 我对 NDB API 进行了简要的了解,并被到处的大 beta 标志吓到了。我已经在使用 python27,它还没有完全准备好生产,我认为如果我一次只使用一个 beta 产品,我的应用程序的风险会略低...
      • 好点。我自己在将应用程序迁移到 2.7 时遇到了相当大的麻烦,显然没有充分的理由(因为麻烦,而不是迁移):-/ 我同意从 2.7 开始是明智的 - 很明显 2.7 是现在的未来.
      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多