11

在我的应用程序中,我执行了一些批处理操作。不幸的是,这有时需要永远更新 400-500 个实体。我拥有的是所有实体键,我需要获取它们,更新属性并将它们保存到数据存储区,保存它们可能需要 40-50 秒,这不是我想要的。

生病简化我的模型来解释我的工作(无论如何这很简单):

class Entity(ndb.Model):
    title = ndb.StringProperty()

keys = [key1, key2, key3, key4, ..., key500]

entities = ndb.get_multi(keys)

for e in entities:  
    e.title = 'the new title'

ndb.put_multi(entities)

获取和修改不会花费太长时间。我试图 get_async 进入一个 tasklet 以及其他任何可能的方法,只有在 get 或 forloop 需要更长的时间时才会改变。

但真正困扰我的是,一个put最多需要50秒......

在相当长的时间内完成此操作的最有效方法是什么。当然,我知道这取决于许多因素,例如实体的复杂性,但是放置所需的时间确实超出了我可以接受的限制。
我已经尝试过异步操作,tasklet ......

4

3 回答 3

8

我想知道是否进行较小的批量(例如 50 个或 100 个实体)会更快。如果你把它变成一个任务,你可以尝试同时运行这些小任务。

我还建议使用Appstats来查看它,看看这是否令人惊讶。

最后假设这使用 HRD,您可能会发现每批实体组的数量存在限制。此限制默认非常低。尝试提高它。

于 2012-04-17T04:54:54.507 回答
0

听起来像是 MapReduce 的设计目的。您可以通过同时获取和修改所有实体来快速完成此操作,跨多个服务器实例进行扩展。但是,使用更多实例会增加您的成本。

于 2012-04-16T20:32:39.377 回答
0

我将假设您拥有所需的实体设计(即,我不会问您要做什么以及您应该如何拥有一个大实体而不是一堆小实体必须一直更新)。因为那样不会很好。( =

如果您使用任务队列怎么办?您可以创建多个任务,每个任务可以将其负责更新的键以及应设置的属性和值作为 URL 参数。这样工作被分解成可管理的块并且用户的请求可以在工作发生在后台时立即返回?那行得通吗?

于 2012-04-16T23:11:39.320 回答