【问题标题】:How to create large number of entities in Cloud Datastore如何在 Cloud Datastore 中创建大量实体
【发布时间】:2015-12-26 13:44:17
【问题描述】:

我的要求是在 Google Cloud Datastore 中创建大量实体。我有 csv 文件,实体的组合数量可能在 50k 左右。我尝试了以下操作:

1. 逐行读取 csv 文件并在 datstore 中创建实体。 问题:运行良好,但超时,无法一次性创建所有实体。

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

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

【问题讨论】:

  • 似乎在 stackoverflow 上不再支持 GAE 了..
  • 或者每年的这个时候只有很多人在度假,所以反应比平时慢;)

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


【解决方案1】:

这里的实体数量不是问题(50K 相对微不足道)。在最后期限内完成您的请求是个问题。

从你的问题中不清楚你在哪里处理你的 CSV,所以我猜这是用户请求的一部分 - 这意味着你有 60 秒的截止日期来完成任务。

任务队列

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

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

注意捕捉 DeadlineExceededError

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

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

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

【讨论】:

  • “确保您的任务保存进度并在 10 分钟截止日期之前返回错误,以便它可以正确恢复而无需捕获错误。”那是什么意思?如果我创建一个实体,它不会自动保存在数据存储中吗?
  • 不,保存的实体会很好。我的意思是保存你在 CSV 中的位置。例如,如果您到达 50000 行中的第 25000 行,并且您的任务已经运行了 9 分钟,您可以保存重试任务时的行位置,以便它知道从第 25000 行开始,而不是 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多