【问题标题】:store a calculated value in the datastore or just calculate it on the fly将计算值存储在数据存储中,或者只是即时计算
【发布时间】:2012-06-29 22:45:47
【问题描述】:

我在 python 中为谷歌应用引擎编写了一个应用程序,每个用户都可以提交一个帖子,每个帖子都有一个由其投票和评论数决定的排名。排名只是基于这两个参数的简单计算。我想知道我应该将这个值存储在数据存储中(并在那里占用空间)还是只是在每次需要时简单地计算它。现在仅供参考,帖子将按排名排序,因此需要考虑在内。

我主要是为了效率考虑,并尝试平衡是否应该尝试保存数据存储空间或保存读/写配额。

我认为简单地存储它会更好,但是每次有人在帖子上投票或 cmets 时,我都需要重新计算和重写排名值。

任何输入都会很棒。

【问题讨论】:

  • 在考虑效率时,请考虑存储数据所需的额外工作。通常,I/O 是比处理能力更大的限制。因此,我倾向于动态计算。

标签: python database performance google-app-engine google-cloud-datastore


【解决方案1】:

如何将排名作为属性存储在帖子中。这对于查询/排序来说是有意义的,不是吗。

如果您在存储投票/评论计数的同时(意味着在同一实体中)存储排名,那么写入成本的唯一增加将是索引。 (好的初始写入成本也是如此,但这就是 2 [无论如何非常小])。

无论如何,每次有人在帖子上投票或 cmets 时,您都需要进行数据库操作,对吧!?!还有什么方法可以跟踪投票/cmets?

不过,实际上,我想您会开始使用文本搜索来查找帖子中的数据。如果是这样,我会考虑将排名作为属性存储在搜索索引中,并使用它来对匹配结果进行排名。

我们不需要考虑您如何选择要显示的帖子。票数排名是唯一标准吗?

【讨论】:

  • 好的,写一个实体的三个属性和两个没有太大区别?不是增加了50%吗?我想不是,但很高兴知道。有类别,但在每个类别中,帖子仅按创建日期或排名排序
  • 为什么要索引票数/cmets?肯定不是票!如果您正在索引 cmets,那么文本搜索不就是要走的路吗?无论如何,不​​要索引您不查找的内容,从而节省您的写作费用。无论如何,成本是(1 次写入 + 每个修改后的索引属性值 4 次写入 + 每个修改后的复合索引值 2 次写入)。参考。 blog.xam.de/2011/11/analysis-of-datastore-operation-cost.html
  • 为什么要索引投票是什么意思?投票只是我的帖子实体的属性,如果我不清楚的话,抱歉。如果 cmets 未编入索引,我如何将它们附加到帖子中?
  • 我的意思是设置投票不被索引。索引属性在更新时需要 4 次写入。您如何存储 cmets?这是我不明白的。您是否在 post 实体中存储 cmets 的密钥?您是否通过保存在 cmets 实体中的 post 键进行过滤?当然,需要对 cme​​ts 实体键进行索引才能进行查找。无论如何,我会尝试 Dave W. Smith 的建议,并定期用你在 memcache 中的投票/评分更新你的实体。
  • 好吧,我还没有真正做到这一点,所以我目前没有做任何这些,我只是想找出最好的方法来做到这一点。我现在打算做的是使用 postID 作为键
【解决方案2】:

当计算成本很高时,缓存最有用。如果计算简单又便宜,还不如根据需要重新计算。

【讨论】:

  • 我更喜欢在内存中缓存而不是将其写入数据库。与写入持久存储相比,它对我来说意味着不那么永久的状态。我也喜欢让它更接近内存,并且不需要网络跃点来获取它。
【解决方案3】:

如果您依赖于在实体中保持运行中的投票计数,那么您要么必须愿意失去偶尔的投票,要么必须使用交易。如果您使用事务,则您每秒可以执行多少事务的速率受到限制。 (请参阅有关交易和实体组的文档)。如果您有可能获得大量选票,那么速率限制可能是个问题。

对于低投票率,在实体中保留计数可能会很好。但是,如果您的投票率出现任何显着峰值,存储单独的投票实体,这些实体会定期汇总到缓存计数中,可能会根据内存缓存中保存的(可能不可靠的)增量计数进行调整,可能对您更有效。

这真的取决于你想要优化什么。如果您试图通过以非事务方式缓存投票计数来尽量减少磁盘写入,那么您可能会失去投票。

【讨论】:

  • 我们谈论的是 1/100 还是更像 1/10? 1/100 问题不大
  • 由于非交易性的 get、increment、put 导致的投票少计将完全取决于投票到达的时间。如果投票相对不频繁,你可能会没事。如果您正在做的事情会涉及几乎同时投票的人群,那么您将处于危险之中。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2017-05-04
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多