【问题标题】:Mass updates in Google App Engine DatastoreGoogle App Engine 数据存储区中的大量更新
【发布时间】:2011-11-20 06:45:29
【问题描述】:

对 Google App Engine 数据存储区中的实体执行大规模更新的正确方法是什么?是否可以在不必检索实体的情况下完成?

例如,在 SQL 中,GAE 等价于这样的东西:

UPDATE dbo.authors
SET    city = replace(city, 'Salt', 'Olympic')
WHERE  city LIKE 'Salt%';

【问题讨论】:

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


    【解决方案1】:

    没有直接翻译。数据存储区确实没有更新的概念;您所能做的就是用相同地址(键)的新实体覆盖旧实体。要更改实体,您必须从数据存储中获取它,在本地对其进行修改,然后将其保存回来。

    也没有与 LIKE 运算符等效的方法。虽然通过一些技巧可以实现通配符后缀匹配,但如果您想匹配“%Salt%”,则必须将每个实体读入内存并在本地进行字符串比较。

    因此它不会像 SQL 那样干净或高效。这是与大多数分布式对象存储的权衡,数据存储也不例外。

    也就是说,the mapper library 可用于促进此类批量更新。按照示例为您的 process 函数使用类似的内容:

    def process(entity):
      if entity.city.startswith('Salt'):
        entity.city = entity.city.replace('Salt', 'Olympic')
        yield op.db.Put(entity)
    

    除了映射器之外还有其他选择。最重要的优化技巧是批量更新;不要单独保存每个更新的实体。如果你使用 mapper 和 yield puts,这会自动处理。

    【讨论】:

    • Drew - 非常感谢映射器参考 - 看起来像是我想要了解的东西。
    【解决方案2】:

    不,不检索实体就无法完成。

    没有“1000 条最大记录限制”之类的东西,但任何单个请求当然都会超时 - 如果您有大量实体要修改,简单的迭代可能会违反这一点。您可以通过将其拆分为多个操作并使用query cursor 或可能使用MapReduce framework 跟踪来管理它。

    【讨论】:

    【解决方案3】:

    您可以使用查询类http://code.google.com/appengine/docs/python/datastore/queryclass.html

     query = authors.all().filter('city >', 'Salt').fetch()
     for record in query:
       record.city = record.city.replace('Salt','Olympic')
    

    【讨论】:

    • 谢谢,但这不是将所有对象都带入内存,并且还受到 1000 条最大记录限制的限制吗?
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多