3

这是一个相当抽象的问题,我希望它在范围内。

我在网络开发方面的编码生涯大约有 5 个月的时间。我发现 CPU 和存储资源之间经常存在紧张关系。简而言之,您可以少用一个,多用另一个,反之亦然(然后考虑速度)。我现在要部署我的第一个应用程序进行生产,所以这个平衡现在是真正的美元和美分的问题。事情是这样的:我真的不知道我应该寻找什么样的平衡

这里有一些突出的例子可能会阐明在不同情况下要达到的平衡。

背景

我正在开发一个在文本之间有很多差异的应用程序。用户将调用包含以 html 显示的差异的页面。很多。

第一个案例

我应该在每次显示页面时运行差异,还是应该运行一次差异,存储它,并在每次显示页面时调用它?

第二种情况

我编写了一个总结差异的算法。它大约有 110 行代码,它使用 4 或 5 个循环和子循环。同样,我应该运行一次并存储结果,以便以后可以调用它们,还是应该在每次显示页面时只运行算法?

也很想听听您对用于量化余额的最佳工具的看法。

4

3 回答 3

4

如果不进行测试很难回答,但您可能想回答以下问题:

1) diff 操作的成本是多少?运行测试或计算复杂度。如果差异操作是针对非常大的文件或快速更改的文件,您可能需要修改算法。如果文件很大、变化很小或随着时间的推移快速变化,那么存储差异似乎不是一个很好的解决方案。

2)您需要多少次使用相同的文件生成相同的差异,是否有与此相关的时间限制?- 如果在短时间内反复生成相同的差异,您可能希望将其缓存而不是将其写入数据库。如果随着时间的推移(几天、几个月)偶尔访问差异,您可能希望在分析上述 1 之后存储它。

您可以在 Amazon Web Services 上使用成本进行基准测试。你再次在那里有选择。您可以只使用单个 EC2 实例来处理所有事情,也可以针对 RDS、EC2 和 S3 拆分工作流,然后分析成本。取决于你想要的规模水平。

于 2012-08-04T07:36:57.397 回答
2

你问的基本上是你应该缓存还是不应该缓存。缓存在大多数情况下是可取的,但您应该限制缓存大小。当缓存已满时,应从缓存中删除最近访问的最少项目,以便为最近访问的项目腾出位置。

少量的缓存通常可以大大降低 CPU 负载。

你不妨看看memcache

Memcache 为您实现了自动删除旧项目以支持新项目。您所要做的就是在生成数据时将其放入缓存中,当您需要数据时首先检查 memcache 是否还有它,如果没有,然后生成它。

于 2012-08-04T07:40:14.873 回答
2

我的建议是将缓存存储在数据库表中,而不是内存中。如果条目被大量引用,它们在内存中(在磁盘缓冲区中)。这种方法的优点是差异将与其他数据库表竞争核心位置,这总是比预分配(和管理)XXX 字节的内存更智能。

另一个优点是维护缓存条目的 {hitcount,date of access, ...} 相对容易,并且它的管理都可以在 SQL 中完成。

请记住:磁盘空间是免费的。在磁盘上拥有 XXX GB 缓存非常容易,并且只有效地使用了 XXX MB。重击者将在内存中,而长尾将位于磁盘上。并且总是可以增加或缩小缓存。

未缓存版本的成本估算:

  • 2 个文件的 I/O + 缓冲内存成本
  • 差异操作的 CPU + 内存成本
  • 结果的缓冲存储器。

缓存版本的成本估算:

  • I/O + 获取差异
  • 用于查询的 CPU + 内存
  • 结果的缓冲存储器

如果比较两者:

  • 未缓存的版本具有更大的 I/O 成本(假设 diff 小于两个文件的总和)
  • 未缓存的版本总是有更大的内存占用
  • 查询成本可能小于差异执行成本。或者它可以更大...
于 2012-08-04T14:09:43.533 回答