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

2 投票
2 回答
715 浏览
提问于 2025-04-17 02:35

我正在测试Google App Engine和Django-nonrel的免费配额。感觉数据库操作在Datastore上非常慢。

举个例子,这里有一个简化的函数,它处理一个请求,接收一堆XML数据,解析这些数据并把它们插入数据库:

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有五个字段,都是字符类型的。

就处理大约30个数据(总共大约1KB的XML)来说,这个函数返回结果需要5秒钟,并且使用了超过30000毫秒的CPU时间。这个CPU时间相当于一个1.2 GHz的Intel x86处理器在这段时间内能完成的工作,但我很确定,任何x86处理器插入30行数据到数据库都不会花30秒。

如果不把对象保存到数据库(也就是说,只解析XML然后丢掉结果),请求只需要几毫秒。

所以,Google App Engine真的慢到连几十个实体都无法在正常请求中保存到Datastore吗?还是我漏掉了什么?当然,即使我在某个后台或使用任务队列来插入数据,这样做的成本也会高得离谱。

补充:我发现默认情况下,GAE对每个实体的每个属性都会进行两次索引写入。大多数属性其实不需要索引,所以问题是:我该如何在Django-nonrel中设置属性为不索引?

不过我还是觉得,即使考虑到索引写入,数据库操作的时间也太离谱了。

2 个回答

3

如果没有批量操作,你就很难减少实际运行时间。批量操作在App Engine(或者任何有远程过程调用的分布式平台)上是非常重要的,可以帮助你节省时间。

在现在的收费模式下,数据存储中报告的CPU毫秒数反映的是操作的费用,而不是实际花费的时间,这是一种资源收费的方式。在新的收费模式下,这些将会被明确地作为数据存储操作来收费。

1

我还没有找到一个确切的答案,但我做了一些关于成本的计算。目前,每个被索引的属性字段在插入1万条数据时大约需要0.20到0.30美元。根据即将推出的计费模式(价格常见问题),每10万次操作的费用将是0.1美元,或者每个被索引的字段在插入10万条数据时需要0.2美元,因为每次插入会有两个索引写入操作。

所以,价格似乎下降了十倍,但观察到的慢速表现确实是意料之外的情况。由于免费的配额足够我进行测试,而且新的计费模式即将到来,所以我现在不会太在意这个问题。

撰写回答