我正在使用免费配额测试 Google App Engine 和 Django-nonrel。在我看来,对数据存储的数据库操作速度慢得可怕。
以这个处理请求的简化函数为例,它接收 XML blob 的多部分/表单数据,解析它们并将它们插入数据库:
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 Intel x86 处理器在这段时间内可以完成的工作量,但我非常确定对于任何可用的 x86 处理器,将 30 行插入数据库不会花费 30 秒。
无需将对象保存到数据库(即,仅解析 XML 并丢弃结果),请求仅需要几毫秒。
那么 Google App Engine 真的应该如此缓慢,以至于我无法在正常请求中将几十个实体保存到数据存储区,还是我在这里遗漏了一些东西?当然,即使我在某些后端或使用任务队列进行插入,它的成本仍然比看起来可接受的高出数百倍。
编辑:我发现,默认情况下,GAE 会为每个实体的每个属性执行两次索引写入。大多数这些属性不应该被索引,所以问题是:如何在 Django-nonrel 上设置未索引的属性?
我仍然觉得,即使有索引写入,数据库操作也花费了荒谬的时间。
最佳答案
在没有批处理操作的情况下,您无法采取太多措施来减少挂钟时间。批处理操作对于减少 App Engine(或者任何具有 RPC 的分布式平台)上的挂钟时间非常重要。
在当前的计费模型下,数据存储区报告的 CPU 毫秒数反射(reflect)了操作的成本,而不是实际花费的时间,并且是一种资源计费方式。在新的计费模型下,这些将明确作为数据存储操作进行计费。
关于python - Google App Engine 上的 Django 数据库操作缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471604/