0

我对 Google App Engine 和 Python 还很陌生,但我刚刚发布了我的第一个真实网站。但是现在我遇到了一条路径的问题,该路径使用的 CPU(和 API CPU)时间比其他路径多得多。我已将其缩小到导致问题的单个数据存储提取:Carvings.all().fetch(1000)

在 App Engine 仪表板下,它为对该路径的每个请求非常可靠地报告“1040cpu_ms 846api_cpu_ms”。看起来这可能是我的客户在网站上普遍经历的一些反应迟钝的原因。

所以我无法弄清楚这个查询的代价是什么。这是相关的数据模型:

class Carving(db.Model):
    title = db.StringProperty(required=True)
    reference_number = db.StringProperty()
    main_category = db.StringProperty()
    sub_category = db.StringProperty()
    image = db.ReferenceProperty(CarvingImage)
    description = db.TextProperty()
    price = db.FloatProperty()
    size = db.StringProperty()
    material = db.StringProperty()
    added_at = db.DateTimeProperty(auto_now_add=True)
    modified_at = db.DateTimeProperty(auto_now=True)

在应用程序的其他地方,当我从数据存储区中提取此模型时,我会进行更多过滤,我想这就是它们不会造成任何麻烦的原因。但是这个模型的实体总数刚刚超过 90 个,我无法想象为什么这么贵。

4

4 回答 4

2
  • Memcache,如果你还没有的话,特别是如果要一次又一次地提取相同的雕刻。如果你总共只有 90 个,我想它们很快就会全部进入缓存,然后你应该是黄金。

  • 你需要雕刻的所有属性吗?例如,如果您只是显示雕刻列表,则可以有一个单独的实体,类似于 CarvingSummary,它只有几个属性。这意味着您的架构被非规范化,但有时这是您为速度付出的代价。

另外,我假设这不是用户总是会点击的第一页?如果是这种情况,则可能是云启动了一个新实例。

于 2009-12-12T05:29:20.153 回答
0

有时,如果您执行索引查询,而不是查询模型中的“所有”元素,您将获得更好的性能。

另外,考虑使用内存缓存。

于 2009-12-12T05:13:02.643 回答
0

你真的需要 1000 个实体吗?CPU 时间随着检索到的结果数量或多或少呈线性增长,因此如果您实际上并不需要所有结果,则可能会浪费大量时间来获取和解码它们。

于 2009-12-12T15:02:21.623 回答
0

可能是图像(和/或 Text 属性)需要时间来加载和编组到对象中,具体取决于这些属性的大小。

一等奖:就像别人说的那样使用内存缓存。然后仅在第一次命中时才会产生开销。

二等奖:我不确定您的图片更改频率以及您可能有多少,但您可以考虑将它们作为静态文件上传并简单地在 HTML 中链接到它们。然后它只是来自浏览器的 HTTP GET - 开销要低得多。

于 2009-12-14T05:21:11.050 回答