如何在Google App Engine上分解高CPU请求?

时间:2008-09-30 16:02:52

标签: performance google-app-engine quotas

举一个例子,说明我无法弄清楚还有什么要做的请求:

该应用程序是bowling score/stat tracker。当某人以高级模式输入他们的分数时,会计算一些统计数据以及他们的分数。数据建模为:

游戏 - 成员喜欢名字,用户,参考保龄球馆,得分 每个球的框架 - 布局,每个球上的针脚被击倒的布尔列表,关于球的路径的信息(站立,目标,实际去向),该帧的得分等 GameStats - 存储整个游戏的计算统计数据,与其他游戏统计数据合并,以便在各组游戏中显示统计数据。

可以在here找到实践中此信息的示例。

当一个游戏完成,一个框架被更新时,我必须更新游戏,框架,它后面的每一帧以及它之前可能的一些(以确保它们的分数是正确的)和统计数据。此操作始终标记CPU监视器。即使游戏不完整,并且不需要计算统计数据,也需要更新分数等以向用户显示实时进度,因此这些也会被标记。此处理程序的平均CPU时间超过7000个mcycles,甚至不显示视图。大多数人在每个系列中进行3到4场比赛 - 如果他们在车道上实时输入他们的分数,那么每2到4分钟大约有1个请求,但是如果他们全部写下来并且稍后输入,则有30-40个这些要求是连续提出的。


根据要求,重要类的数据模型:

class Stats(db.Model):
  version = db.IntegerProperty(default=1)
  first_balls=db.IntegerProperty(default=0)
  pocket_tracked=db.IntegerProperty(default=0)
  pocket=db.IntegerProperty(default=0)
  strike=db.IntegerProperty(default=0)
  carry=db.IntegerProperty(default=0)
  double=db.IntegerProperty(default=0)
  double_tries=db.IntegerProperty(default=0)
  target_hit=db.IntegerProperty(default=0)
  target_missed_left=db.IntegerProperty(default=0)
  target_missed_right=db.IntegerProperty(default=0)
  target_missed=db.FloatProperty(default=0.0)
  first_count=db.IntegerProperty(default=0)
  first_count_miss=db.IntegerProperty(default=0)

  second_balls=db.IntegerProperty(default=0)
  spare=db.IntegerProperty(default=0)
  single=db.IntegerProperty(default=0)
  single_made=db.IntegerProperty(default=0)
  multi=db.IntegerProperty(default=0)
  multi_made=db.IntegerProperty(default=0)
  split=db.IntegerProperty(default=0)
  split_made=db.IntegerProperty(default=0)

class Game(db.Model):
  version = db.IntegerProperty(default=3)
  user = db.UserProperty(required=True)
  series = db.ReferenceProperty(Series)
  score = db.IntegerProperty()
  game_number = db.IntegerProperty()
  pair = db.StringProperty()
  notes = db.TextProperty()
  simple_entry_mode = db.BooleanProperty(default=False)
  stats = db.ReferenceProperty(Stats)
  complete = db.BooleanProperty(default=False)

class Frame(db.Model):
  version = db.IntegerProperty(default=1)
  user = db.UserProperty()
  game = db.ReferenceProperty(Game, required=True)
  frame_number = db.IntegerProperty(required=True)
  first_count = db.IntegerProperty(required=True)
  second_count = db.IntegerProperty()
  total_count = db.IntegerProperty()
  score = db.IntegerProperty()
  ball = db.ReferenceProperty(Ball)
  stance = db.FloatProperty()
  target = db.FloatProperty()
  actual = db.FloatProperty()
  slide = db.FloatProperty()
  breakpoint = db.FloatProperty()
  pocket = db.BooleanProperty()
  pocket_type = db.StringProperty()
  notes = db.TextProperty()
  first_pinfall = db.ListProperty(bool)
  second_pinfall = db.ListProperty(bool)
  split = db.BooleanProperty(default=False)

1 个答案:

答案 0 :(得分:1)

一些建议:

  • 您可以将帧的统计信息存储为与游戏相同的实体的一部分,而不是为每个帧存储一个单独的实体,方法是将其存储为位于末尾的引脚的位域列表(存储在整数中)。例如,每个半帧。如果您想了解如何实施此更多详细信息,请与我们联系。
  • 如果不这样做,你可以计算一些关于fetch的更相互关联的统计数据。例如,如果您同时加载整个游戏,那么计算得分应该很简单,这意味着您可以避免在每次请求时更新多个帧。
  • 如果您向我们展示您的数据模型,我们可以提供更多帮助。 :)