最近,我不得不将48,000条记录导入Google App Engine。存储的“表”是“ndb.model”类型。为完整性目的,对“数据库”中的其他几个“表”检查这些记录中的每一个,然后写入(.put())。
为此,我将.csv文件上传到Google云端存储中,然后在任务队列中对其进行处理。这处理了大约每秒10 .csv行,并且在41,000条记录之后出现内存不足错误。将.csv文件拆分为2组24,000条记录,每个都解决了这个问题。
所以,我的问题是:
a)这是最好的方法吗?
b)是否有更快的方式(下一次上传可能是大约400,000条记录)?和
c)如何克服(或停止)内存不足错误?
非常感谢, 大卫
答案 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()