我的要求是在Google Cloud Datastore中创建大量实体。我有csv文件,并且组合数量的实体可以大约50k。我试过以下:
1。逐行读取csv文件并在datstore中创建实体。 问题:效果不错但超时但无法一次性创建所有实体。
2。上传Blobstore中的所有文件并将其重命名为数据存储区 问题:我尝试使用Mapper函数来读取在Blobstore中上传的csv文件,并在数据存储区中创建实体。我遇到的问题是,如果文件大小超过2Mb,则映射器不起作用。此外,我只是尝试读取servlet中的文件,但又是时间问题。
我正在寻找一种方法在数据存储中一次创建大量(50k +)以上的大量实体。
答案 0 :(得分:0)
实体数量不是这里的问题(50K是相对微不足道的)。在截止日期前完成您的请求是个问题。
从您的问题中不清楚您处理CSV的位置,因此我猜测它是用户请求的一部分 - 这意味着您有60秒的任务完成截止日期。
我建议你考虑使用Task Queues,当你上传需要处理的CSV时,你将push放入队列进行后台处理。
使用任务队列时,任务本身仍然有一个截止日期,但是大于60秒(自动缩放时为10分钟)。您应该阅读有关deadlines in the docs的更多信息,以确保了解如何处理它们,包括捕获DeadlineExceededError
错误,以便您可以在CSV中进行保存,以便可以从中恢复retried时的位置。
警告:可能会从程序中的任何位置(包括finally块)引发DeadlineExceededError,因此可能会使程序处于无效状态。这可能会导致线程代码(包括内置线程库)中的死锁或意外错误,因为可能无法释放锁。请注意(与Java不同)运行时可能无法终止进程,因此这可能会导致将来对同一实例的请求出现问题。为了安全起见,您不应该依赖于DeathExceededError,而是确保您的请求在时间限制之前完成。
如果您担心上述情况,并且无法确保您的任务在10分钟的截止日期内完成,您有2个选择: