【问题标题】:Is it possible to bulk load an NDB child Entity in GAE?是否可以在 GAE 中批量加载 NDB 子实体?
【发布时间】:2014-05-21 03:38:42
【问题描述】:

在未来的某个时候,我可能需要批量加载迁移数据(即来自 CSV)。有没有人提出以下例外情况?如果使用 ndb.put_multi() 函数,行为是否也有任何变化?

from google.appengine.ext import ndb

while True:

    if not id:
        break
    id, name = read_csv_row(readline())
    x = X(parent=ndb.Key('Y','static_id')
    x.id, x.name = id, name
    x.put()

class X(ndb.Model):

    id = StringProperty()
    name = StringProperty()

class Y(ndb.Model):

    pass

def read_csv_row(line):

    """returns tuple"""

【问题讨论】:

  • 是的,但是您提供的代码不起作用。如果您运行该代码,您将得到很多异常;-)。如果整个过程花费的时间超过 60 秒,则需要考虑使用任务。如果您需要用户执行任务,请先将文件上传到 GCS,然后启动任务以进行导入。
  • @TimHoffman,感谢您的建议。我会考虑使用 GCS。实际代码是针对可能在短时间内以每秒超过 1 条消息的速度进入的入站邮件,因此我猜需要一些排队。知道我会怎么做吗?
  • 您可以将电子邮件存储在数据存储中,如果它们超过 1MB,则可以存储在 gcs 中。在数据存储中保留一个代理对象。然后您可以将这些记录用作您的队列。启动一个命名任务以在 10 分钟内处理队列中的所有邮件或尽可能多的邮件。值得一读尼克约翰逊关于任务队列的一些文章 - blog.notdot.net/tag/deferred。事实上,我建议值得阅读他关于 appengine 的所有文章 ;-)

标签: google-app-engine python-2.7 app-engine-ndb


【解决方案1】:

根据我的研究并感谢 cmets,似乎上面的代码(它变成有效代码的地方)会产生问题,最终会导致 google.appengine.api.datastore_errors.Timeout 异常被抛出。

查看另一个问题:

Datastore write limit tests - trying to break app engine, but it won´t break ;)

到目前为止我最好的建议是使用任务队列来限制这个。更多信息:

blog.notdot.net/tag/deferred

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多