如何在Cloud Datastore中创建大量实体

时间:2015-12-26 13:44:17

标签: database csv import google-cloud-datastore google-cloud-platform

我的要求是在Google Cloud Datastore中创建大量实体。我有csv文件,并且组合数量的实体可以大约50k。我试过以下:

1。逐行读取csv文件并在datstore中创建实体。 问题:效果不错但超时但无法一次性创建所有实体。

2。上传Blobstore中的所有文件并将其重命名为数据存储区 问题:我尝试使用Mapper函数来读取在Blobstore中上传的csv文件,并在数据存储区中创建实体。我遇到的问题是,如果文件大小超过2Mb,则映射器不起作用。此外,我只是尝试读取servlet中的文件,但又是时间问题。

我正在寻找一种方法在数据存储中一次创建大量(50k +)以上的大量实体。

1 个答案:

答案 0 :(得分:0)

实体数量不是这里的问题(50K是相对微不足道的)。在截止日期前完成您的请求是个问题。

从您的问题中不清楚您处理CSV的位置,因此我猜测它是用户请求的一部分 - 这意味着您有60秒的任务完成截止日期。

任务队列

我建议你考虑使用Task Queues,当你上传需要处理的CSV时,你将push放入队列进行后台处理。

使用任务队列时,任务本身仍然有一个截止日期,但是大于60秒(自动缩放时为10分钟)。您应该阅读有关deadlines in the docs的更多信息,以确保了解如何处理它们,包括捕获DeadlineExceededError错误,以便您可以在CSV中进行保存,以便可以从中恢复retried时的位置。

警告捕捉DeadlineExceededError

警告:可能会从程序中的任何位置(包括finally块)引发DeadlineExceededError,因此可能会使程序处于无效状态。这可能会导致线程代码(包括内置线程库)中的死锁或意外错误,因为可能无法释放锁。请注意(与Java不同)运行时可能无法终止进程,因此这可能会导致将来对同一实例的请求出现问题。为了安全起见,您不应该依赖于DeathExceededError,而是确保您的请求在时间限制之前完成。

如果您担心上述情况,并且无法确保您的任务在10分钟的截止日期内完成,您有2个选择:

  1. 切换到手动缩放的实例,为您提供24小时的截止日期。
  2. 确保您的任务保存进度并在10分钟截止日期之前返回错误,以便可以正确恢复它而不必捕获错误。