我的应用程序只有一个带有两个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)
答案 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库吗?它带有管道库,你可以利用它们: