Google App Engine:高效的大型删除(约90000 /天)

我有一个只有一个模型和两个StringProperties的应用程序。

实体的初始数量约为1亿(我将用散装加载程序上传这些数据)。

每24小时,我必须删除约7万个实体并添加10万个实体。 我现在的问题是:删除这些实体的最佳方式是什么?

无论如何避免在删除实体之前获取实体? 我无法找到一种做法,如:

DELETE from xxx WHERE foo1 IN ('bar1', 'bar2', 'bar3', ...)

我意识到,应用程序引擎提供了一个IN子句(尽管最大长度为30(因为每个GQL查询1的个别请求数量最大)),但对我来说,仍然看起来很奇怪,因为我必须获取x实体和然后再次删除它们(每个实体进行两次RPC调用)。

注意:如果未找到该实体,则应忽略该实体。

编辑:增加了有关问题的信息

这些实体只是域名。 第一个字符串是SLD,第二个字符串是TLD(没有子域)。 该应用程序可用于执行如下http:// [...] /available/stackoverflow.com的请求。 该应用程序将返回一个True / False json对象。

为什么我有这么多实体? 因为数据存储包含所有注册的域(现在为.com)。 由于TOS和延迟,我无法在每种情况下执行Whois请求。 因此,我最初使用整个区域文件填充数据存储,然后每天添加/删除已注册/删除的域...问题是,这些数量非常大,我必须找出一种方法来降低成本并每天添加/删除2 *〜100000个域名。

注意:几乎没有任何计算正在进行,因为可用性请求只是检查数据存储中是否存在域!

1:'任何单个GQL查询最多允许30个数据存储区查询。' (http://code.google.com/appengine/docs/python/datastore/gqlreference.html)


如果还没有这样做,你应该使用key_names来做到这一点。

你会想要一个模型:

class UnavailableDomain(db.Model):
    pass

然后你将填充你的数据存储,如:

UnavailableDomain.get_or_insert(key_name='stackoverflow.com')
UnavailableDomain.get_or_insert(key_name='google.com')

然后你会用类似的方式查询可用的域名:

is_available = UnavailableDomain.get_by_key_name('stackoverflow.com') is None

然后当你需要删除一堆域名,因为它们已经可用了,你可以建立一个大的密钥列表,而不必先查询数据库,如:

free_domains = ['stackoverflow.com', 'monkey.com']
db.delete(db.Key.from_path('UnavailableDomain', name) for name in free_domains)

如果您的free_domains列表真的很大,我仍然会建议将删除的数量增加到每个RPC 200个


你有没有考虑过appengine-mapreduce库。 它配备了管道库,您可以利用它们来:

  • 为每个24小时通过cron运行的整体任务创建一个管道
  • “总体”管道将启动一个映射器,用于过滤实体并产生删除操作
  • 在删除映射器完成之后,“整体”管道可以调用“导入”管道来开始运行实体创建部分。
  • 然后管道API可以向您发送一封电子邮件来报告其状态
  • 链接地址: http://www.djcxy.com/p/23215.html

    上一篇: Google App Engine: efficient large deletes (about 90000/day)

    下一篇: Query response size limit on appengine?