【发布时间】:2011-09-19 13:20:06
【问题描述】:
我正在使用免费配额测试 Google App Engine 和 Django-nonrel。在我看来,对 Datastore 的数据库操作非常缓慢。
以这个处理请求的简化函数为例,它接收 XML blob 的 multipart/form-data,解析它们并将它们插入数据库:
def post(request):
fields = cgi.FieldStorage(request)
with transaction.commit_on_success():
for xmlblob in fields.getlist('xmlblob'):
blob_object = parse_xml(xmlblob)
blob_object.save()
Blob_object 有五个字段,它们都是 CharField 类型。
仅约。 30 个 blob(总共大约 1 kB 的 XML),该函数需要 5 秒才能返回,并使用超过 30000 api_cpu_ms。 CPU 时间应该相当于 1.2 GHz 英特尔 x86 处理器在这段时间内可以完成的工作量,但我很确定将 30 行插入到任何可用 x86 处理器的数据库中不会花费 30 秒。
无需将对象保存到数据库(即仅解析 XML 并丢弃结果),请求只需几毫秒。
那么 Google App Engine 真的应该这么慢,以至于我无法在正常请求中将几十个实体保存到数据存储区,还是我在这里遗漏了什么?当然,即使我会在某些后端或使用任务队列中进行插入,它的成本仍然是看起来可以接受的数百倍。
编辑: 我发现,默认情况下,GAE 为每个实体的每个属性执行两次索引写入。这些属性中的大多数不应该被索引,所以问题是:如何在 Django-nonrel 上设置未索引的属性?
尽管如此,我仍然觉得,即使使用索引写入,数据库操作也会花费大量时间。
【问题讨论】:
-
每个实体需要写多少个索引?批处理你的 put 可能也有帮助......
-
只有一个索引需要更新。在 Django-nonrel 中仍然不支持批处理 put,但它的建议补丁承诺只切断大约 50 毫秒的 API CPU 使用,我认为这实际上只是操作之间的随机变化。
-
我怀疑您低估了索引,因为其中一些索引会自动发生,除非您采取明确的步骤来禁用它们。 1.5.4 SDK 中的 Datastore 查看器将显示保存实体所需的写入次数。
-
你是对的。即使有 1 个索引只有一个属性可供排序,每个 put 也会执行 10 次索引写入。我更新了问题。
标签: python google-app-engine google-cloud-datastore django-nonrel