我试图在批处理中插入少量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个实体的限制。无论如何,在批处理操作中存储任意数量的实体。
答案 0 :(得分:1)
使用许多小批量或少量大批量不会影响写入一组数据所需的写操作次数。但是,确保具有相同根密钥的实体位于同一批次中将影响最大写入速率。
GAE胖客户端自动拆分请求并合并结果,以便所有请求的实体少于500个。最终可能会更新HTTP API以执行此操作,但今天不会。
答案 1 :(得分:0)
google文档确实讨论了限制。 在Cloud Datastore API中可以传递给Commit操作的最大实体数不应超过500。
有3种可能的解决方案: