Google App Engine上缓慢的Django数据库操作

时间:2011-09-19 13:20:07

标签: python google-app-engine google-cloud-datastore django-nonrel

我正在使用免费配额测试Google App Engine和Django-nonrel。在我看来,数据库操作到数据存储的速度非常慢。

以此简化函数处理请求,该请求接收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 Intel x86处理器在那段时间内可以完成的工作量,但我非常确定,对于任何可用的x86处理器,将30行插入数据库不需要30秒。

如果不将对象保存到数据库(即只解析XML并丢弃结果),请求只需几毫秒。

Google App Engine真的应该这么慢,以至于我无法在正常请求中将几十个实体保存到数据存储区,或者我在这里遗漏了什么?当然,即使我会在某些后端或使用任务队列进行插入操作,它仍然会花费数百倍于看似可接受的数量。

编辑:我发现,默认情况下,GAE为每个实体的每个属性执行两次索引写入。大多数这些属性不应该被编入索引,因此问题是:如何在Django-nonrel上设置未编入索引的属性?

我仍然觉得,即使使用索引写入,数据库操作也需要花费大量时间。

2 个答案:

答案 0 :(得分:3)

在没有批量操作的情况下,您无法减少挂钟时间。批处理操作对于减少App Engine(或任何带有RPC的分布式平台)的挂钟时间非常重要。

在当前的计费模式下,数据存储区报告的CPU毫秒数反映了操作的成本而不是实际花费的时间,并且是对资源进行计费的一种方式。在新的结算模式下,这些将明确地计入数据存储区操作。

答案 1 :(得分:1)

我还没有找到真正的答案,但我对成本进行了一些计算。目前,每个索引属性字段的成本约为每10k插入0.20美元到0.30美元。使用即将推出的结算模式(Pricing FAQ),每100k操作的成本将为0.1美元,或每100k插入每个索引字段0.2美元,每个插入2个索引写入操作。

因此价格似乎下降了十倍,观察到的缓慢确实是出乎意料的行为。由于免费配额足以满足我的测试需求,而新的定价模式即将推出,我现在不会让它感到困扰。