向Google应用程序引擎NDB(Python)添加大量数据

向Google应用程序引擎NDB(Python)添加大量数据,python,google-app-engine,python-2.7,Python,Google App Engine,Python 2.7,我正在从事一个项目,需要将大量数据(数万个实体的规模)导入谷歌应用程序引擎NDB 数据存储在一个文本文件中,为此我编写了一个解析程序,生成文件中找到的实体列表,然后使用put\u multi()方法将其写入数据库 当我将其应用于测试数据集时,比如说几百个到大约1000个条目,效果很好;然而,将其应用于实际数据集(目前大约有30000个条目,但它会增加),会抛出一个死线ExceedederRor。我猜这意味着程序运行时间太长,应用程序引擎会将其关闭 所以我的问题是,当代码在一堆数据上迭代时,如何运

我正在从事一个项目,需要将大量数据(数万个实体的规模)导入谷歌应用程序引擎NDB

数据存储在一个文本文件中,为此我编写了一个解析程序,生成文件中找到的实体列表,然后使用
put\u multi()
方法将其写入数据库

当我将其应用于测试数据集时,比如说几百个到大约1000个条目,效果很好;然而,将其应用于实际数据集(目前大约有30000个条目,但它会增加),会抛出一个死线ExceedederRor。我猜这意味着程序运行时间太长,应用程序引擎会将其关闭

所以我的问题是,当代码在一堆数据上迭代时,如何运行需要很长时间才能完成的代码

我读过一些关于任务队列之类的东西,但这似乎更多的是针对需要重复多次的短任务(而在这里,我只是在等待
put\u multi()
完成)

这也是一个相当糟糕的用户体验,页面加载需要这么长时间。我有没有办法让我的代码在用户初始化数据导入时运行,就像在服务器后台启动实际的解析和编写代码一样,而用户得到一个页面,上面说数据正在后台处理

谢谢,这里有一个put_multi_async(),需要10毫秒才能完成,然后在后台执行put。您仍然受到数据存储截止日期的限制,即:

默认截止时间为60秒 ()

您可能需要将异步put分散到不同的调用中(每个调用可能有几千个,写入速度取决于实体的确切大小)

编辑:根据mgilson的评论


您还受到内存限制。如果您有足够的内存来放入整个文件,那么任务队列可能就是答案(将文件的一堆不同部分放入不同的任务中)

有一个put_multi_async(),需要10毫秒才能完成,然后在后台执行put。您仍然受到数据存储截止日期的限制,即:

默认截止时间为60秒 ()

您可能需要将异步put分散到不同的调用中(每个调用可能有几千个,写入速度取决于实体的确切大小)

编辑:根据mgilson的评论


您还受到内存限制。如果您有足够的内存来放入整个文件,那么任务队列可能就是答案(将文件的一堆不同部分放入不同的任务中)


这正是任务队列的用途:在正常超时时间内无法完成的长时间运行的任务。您应该编写一个请求处理程序来上载文件,然后触发任务


一种更具可扩展性的方法是使用在多个工作人员之间分配任务。

这正是任务队列的用途:在正常超时时间内无法完成的长时间运行任务。您应该编写一个请求处理程序来上载文件,然后触发任务


一种更具可扩展性的方法是使用在许多工作人员之间分配任务。

您还受到内存限制的限制。如果你有足够的内存来提取整个文件,那么任务队列可能就是答案(将文件的一堆不同部分放入不同的任务)@mgilson如果你不确定,我会用你的评论编辑我的答案,以确保人们都能看到。考虑到评论(以及我发表的任何评论)在公共领域被授权;因此,我应该获取条目列表,将其拆分为每个条目大约1000个的列表,然后在这些列表中循环调用
put\u multi\u async()
~30次?这可能是个好主意。每次put\u multi\u async有60秒。我会做一些测试,看看你的代码需要多长时间才能工作,但每个1000似乎是一个不错的尺寸。你也受到内存限制的限制。如果你有足够的内存来提取整个文件,那么任务队列可能就是答案(将文件的一堆不同部分放入不同的任务)@mgilson如果你不确定,我会用你的评论编辑我的答案,以确保人们都能看到。考虑到评论(以及我发表的任何评论)在公共领域被授权;因此,我应该获取条目列表,将其拆分为每个条目大约1000个的列表,然后在这些列表中循环调用
put\u multi\u async()
~30次?这可能是个好主意。每次put\u multi\u async有60秒。我会做一些测试,看看你的代码需要“多长时间”才能工作,但是每个1000似乎是一个很好的尺寸mapreduce框架说它仍然是实验性的——所以我不能构建保证在将来继续工作的东西,可以吗?这意味着他们可以将框架更改到某些函数会更改/消失的程度。如果您希望代码不必为这些更改进行重构,那么mapreduce可能不适合您。使用mapreduce thoughOk仍然是一件非常简单的事情,谢谢。如果
put\u multi\u async()
不起作用,我将学习如何做到这一点。mapreduce框架说它仍然是实验性的——因此我无法构建保证在将来继续工作的东西,可以吗?这意味着他们可以将框架更改到某些函数将改变/消失的程度。如果您希望代码不必为这些更改进行重构,那么mapreduce可能不适合您。使用mapreduce thoughOk仍然是一件非常简单的事情,谢谢。如果
put\u multi\u async()
不起作用,我将学习如何做到这一点。