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

How to create large number of entities in Cloud Datastore

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

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

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

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

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

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

任务队列

我建议您考虑使用 Task Queues, where when you upload a CSV that needs processing, you push 将其放入后台处理队列。

使用任务队列时,任务本身仍然有截止日期,但超过 60 秒(自动缩放时为 10 分钟)。您应该阅读有关 deadlines in the docs to make sure you understand how to handle them, including catching the DeadlineExceededError error so that you can save when you are up to in a CSV so that it can be resumed from that position when retried.

的更多信息

注意捕获 DeadlineExceededError

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

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

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