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

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

我正在使用免费配额测试 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/

相关文章:

python - Hadoop Docker容器只能复制到0个节点,而不能复制到minReplication(= 1)

python - 如何在 Seaborn lmplot facetgrid 中设置一些 xlim 和 ylim

python - 使用 Google Data API 时 GAE 中的本地时区问题

java - 无法通过键从数据存储区获取实体

java - App 引擎数据存储区 : How to implement Posts and Tags without joins?

python - 需要调用函数的帮助

python - 如何追加到 Django 模型中的现有字段?

google-app-engine - 是否可以从谷歌应用引擎响应 header 中删除 "Google Frontend"?

java - 在 Google Appengine 服务器上使用 Polymer 应用进行路由

python - 命名空间可以启用多个域吗?