不能在单个调用中写入超过500个实体



我尝试在批处理中插入几个100,000个实体,并得到以下异常:

Exception in thread "main" com.google.api.services.datastore.client.DatastoreException: cannot write more than 500 entities in a single call
at com.google.api.services.datastore.client.RemoteRpc.makeException(RemoteRpc.java:114)
at com.google.api.services.datastore.client.RemoteRpc.call(RemoteRpc.java:80)
at com.google.api.services.datastore.client.Datastore.commit(Datastore.java:85)
at com.tribalfusion.openbidder.datastorecommons.DatastoreHelper.commitRequest(DatastoreHelper.java:117)
at com.tribalfusion.openbidder.datastorecommons.DatastoreHelper.upsert(DatastoreHelper.java:97)
at com.tribalfusion.openbidder.datastorecommons.test.DatastoreTester.main(DatastoreTester.java:36)
Caused by: com.google.api.client.http.HttpResponseException: 400 Bad Request
cannot write more than 500 entities in a single call
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1047)
at com.google.api.services.datastore.client.RemoteRpc.call(RemoteRpc.java:77)
... 4 more
Disconnected from the target VM, address: '127.0.0.1:53787', transport: 'socket'

我检查了数据存储文档,没有提到每个写操作限制500个实体。是否可以在批处理中存储任意数量的实体op.

使用大量的小批处理或少量的大批处理并不影响写入一组数据所需的写操作数。但是,确保根密钥相同的实体在同一个批处理中会影响最大写速率。

GAE厚客户端自动拆分请求并合并结果,以便所有请求的实体少于500个。HTTP API可能最终也会更新,但现在还没有。

google文档确实谈到了限制。在云数据存储API中,可以传递给Commit操作的最大实体数不应超过500。

完整文章在这里

这个问题有三种可能的解决方案:

  1. 通过联系GCP支持来增加配额/限制
  2. 批量提交
  3. 限制记录数为500

查看此博客了解详情

最新更新