Python Google App Engine上Django数据库操作速度慢

Python Google App Engine上Django数据库操作速度慢,python,google-app-engine,google-cloud-datastore,django-nonrel,Python,Google App Engine,Google Cloud Datastore,Django Nonrel,我正在用免费配额测试谷歌应用程序引擎和Django Nonl。在我看来,数据库对数据存储的操作速度非常慢 例如,这个处理请求的简化函数接收XML blob的多部分/表单数据,解析它们并将它们插入数据库: def post(request): fields = cgi.FieldStorage(request) with transaction.commit_on_success(): for xmlblob in fields.getlist('xmlblob')

我正在用免费配额测试谷歌应用程序引擎和Django Nonl。在我看来,数据库对数据存储的操作速度非常慢

例如,这个处理请求的简化函数接收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_对象有五个字段,都是CharField类型

对于大约30个blob(总共约1KB的XML),该函数需要5秒返回,并且使用30000多个api_cpu_ms。cpu时间应该相当于1,2 GHz Intel x86处理器在这段时间内可以完成的工作量,但我非常确定,对于任何可用的x86处理器,向数据库插入30行不会花费30秒

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

那么,谷歌应用程序引擎真的应该如此缓慢,以至于我无法在一个普通请求中保存几十个实体到数据存储中,还是我遗漏了什么?当然,即使我在一些后端或通过使用任务队列进行插入,它的成本仍然比看起来可以接受的高出数百倍

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


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

在没有批处理操作的情况下,要减少挂钟时间,您也无能为力。批处理操作对于减少appengine(或者任何带有rpc的分布式平台)上的挂钟时间非常重要


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

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


因此,由于价格似乎下降了10倍,观察到的缓慢确实是出乎意料的行为。由于免费配额对于我的测试运行来说已经足够了,而且新的定价模型即将推出,我现在不会让它困扰我。

每个实体需要写多少个索引?批处理您的卖出期权也可能有帮助…只有一个索引需要更新。Django Nonl仍然不支持批处理puts,但建议的补丁承诺只会减少大约50毫秒的API CPU使用,我认为这实际上只是操作之间的随机变化。我怀疑您对索引计数不足,因为有些索引是自动发生的,除非您采取显式步骤禁用它们。1.5.4 SDK中的数据存储查看器将向您显示保存实体所需的写入次数。您是对的。即使1个索引只有一个属性可供排序,每个put也会执行10次索引写入。我更新了问题。