【问题标题】:Importing data into Google App Engine将数据导入 Google App Engine
【发布时间】:2024-05-04 10:15:03
【问题描述】:

最近我不得不将 48,000 条记录导入 Google App Engine。存储的“表”是“ndb.model”类型。为了完整性,这些记录中的每一个都与“数据库”中的几个其他“表”进行检查,然后写入 (.put())。

为此,我将一个 .csv 文件上传到 Google Cloud Storage 并从那里在任务队列中处理它。这每秒处理大约 10 .csv 行,并在 41,000 条记录后出现内存不足错误。将 .csv 文件拆分为 2 组 24,000 条记录,每组可解决此问题。

所以,我的问题是:

a) 这是最好的方法吗?

b) 有没有更快的方法(下一次上传可能是大约 400,000 条记录)?和

c) 我如何克服(或停止)内存不足错误?

非常感谢, 大卫

【问题讨论】:

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


    【解决方案1】:

    1) 您是否考虑过(即使是暂时的)升级您的服务器实例?

    https://cloud.google.com/appengine/docs/standard/#instance_classes

    2) 我认为 41000 行的 csv 不足以耗尽内存,因此您可能需要更改处理方式:

    a) 使用多个任务分解处理,滚动您自己的光标一次处理几千个,然后启动一个新任务。

    b) 试验ndb.put_multi()

    分享你的循环和puts的一些代码可能会有所帮助

    【讨论】:

      【解决方案2】:

      ndb 上下文缓存可能导致内存错误。来自docs

      在后台任务中执行长时间运行的查询时,上下文缓存可能会消耗大量内存。这是因为缓存保留了在当前上下文中检索或存储的每个实体的副本。为避免长时间运行的任务中出现内存异常,您可以disable the cache or set a policy 排除占用内存最多的实体。

      您可以通过在 ndb 调用中设置上下文选项来逐个阻止缓存,例如

      foo.put(use_cache=False)

      如果您经常使用相同的对象进行比较,则完全禁用缓存可能会降低性能。如果是这种情况,您可以定期刷新缓存以防止它变得太大。

      if some_condition:
          context = ndb.get_context()
          context.clear_cache()
      

      【讨论】: