【问题标题】:Why is GAE datastore so slow?为什么 GAE 数据存储这么慢?
【发布时间】:2013-09-19 18:28:28
【问题描述】:

假设我在数据存储中添加了一个新用户。我必须为他添加 200 行(它们只包含零)。但这可能需要 40 秒。注册我网站的真实用户必须等待这次才能继续。在 MySQL 中,它只需要几分之一秒。你有什么建议?

考虑一下这段代码。在 Google 服务器上需要 10 秒,这仍然太慢了。

def get(self):

    class Movie(ndb.Model):
        title =  ndb.StringProperty (required=True)
        rating = ndb.IntegerProperty (required=True)

        @classmethod
        def populate(cls, n):
            for i in range(n):
                o = cls(title='foo', rating=5)
                o.put()

    t1 = datetime.datetime.now()

    Movie.populate(200)

    t2 = datetime.datetime.now()
    self.response.write(t2 - t1) # ~10 seconds

【问题讨论】:

  • 您是在逐个添加用户吗?这肯定会很慢,因为每个 API 操作都会往返于数据库服务器。您应该使用多输入,例如通过一次 put 操作放置所有 200 个实体。
  • 您还应该考虑一下为什么需要一次创建 200 个空实体。您对术语的选择也令人困惑,您指的是用户,在创建电影实体时,当现在只有实体的行时,您使用行。

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


【解决方案1】:

如评论中所述 - 创建一个实体列表并使用 multi-put 保存它们,而不是一个一个地保存实体。

【讨论】:

    【解决方案2】:

    坦率地说,我建议使用更合理的数据模型。完全没有理由创建具有 200 个字段的模型。不仅初始设置需要很长时间,而且加载每个实例的成本都很高,而且保存起来也非常昂贵。

    无论如何,您几乎可以肯定不需要从一开始就实例化所有字段。

    (另外,我必须说,即使有 200 个字段,花费 40 秒来保存似乎也极不可能。您可能在做一些奇怪的事情,但没有看到任何代码就无法判断。)

    【讨论】:

    • “字段”我的意思不是“属性”,而是实际的“行”(在相对数据库意义上)。在 GAE 中添加新行(记录)非常慢。
    • 好的,感谢您的澄清。不过仍然需要查看一些代码。这是在开发还是在生产中?
    • 生产。我不提供代码,因为这个想法很简单。想象一个用户模型,他的姓名和电子邮件只有两个属性。添加 200 个新用户大约需要 40 秒。而且我不知道如何快速填充数据存储。
    • 好吧,我问你代码的原因是这绝对不符合我的经验。您可以在几秒钟内轻松创建数百行。
    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 2011-03-21
    • 2017-01-04
    • 2012-02-13
    • 2021-09-03
    • 1970-01-01
    • 2011-02-24
    • 2011-04-15
    相关资源
    最近更新 更多