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

时间:2011-08-07 11:17:27

标签: google-app-engine gql

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

实体的初始数量约为1亿(我将使用批量加载器上传那些实体)。

每24小时我必须删除大约70000个实体并添加100000个实体。我现在的问题是:删除这些实体的最佳方法是什么?

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

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

我意识到app引擎提供了一个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

2 个答案:

答案 0 :(得分:2)

如果您还没有这样做,那么您应该使用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个。

答案 1 :(得分:0)

您考虑过appengine-mapreduce库吗?它带有管道库,你可以利用它们:

  • 为每24小时通过cron运行的整体任务创建一个管道
  • “整体”管道将启动一个过滤器实体并生成删除操作的映射器
  • 删除映射器完成后,“整体”管道可以调用“导入”管道来开始运行实体创建部件。
  • 管道API可以向您发送电子邮件以报告其状态