将数据导入Google App Engine

时间:2018-03-09 02:02:40

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

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

为此,我将.csv文件上传到Google云端存储中,然后在任务队列中对其进行处理。这处理了大约每秒10 .csv行,并且在41,000条记录之后出现内存不足错误。将.csv文件拆分为2组24,000条记录,每个都解决了这个问题。

所以,我的问题是:

a)这是最好的方法吗?

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

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

非常感谢, 大卫

2 个答案:

答案 0 :(得分:3)

1)您是否考虑过(甚至暂时)升级服务器实例?

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

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

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

b)试验ndb.put_multi()

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

答案 1 :(得分: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()