哪个更贵(以美元计):数据库内存还是处理能力?

时间:2012-08-04 07:12:35

标签: python postgresql heroku hosting

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

我在网络开发方面的编程生涯已经有5个月了。我发现CPU和存储资源之间经常存在紧张关系。简而言之,您可以使用较少的一个或多个,反之亦然(然后投入速度考虑)。我现在已经开始部署我的第一个应用程序用于生产,所以这个平衡现在是真正的美元和美分的问题。问题是:我真的没有任何想法我应该寻找什么样的平衡。

这里有一些显着的例子,可以说明在不同情况下可以达到的平衡。

背景

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

第一个案例

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

第二种情况

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

您可以使用Amazon Web Services上的成本进行基准测试。你再次有选择。您可以只为一切使用单个EC2实例,或者将工作流分为RDS,EC2和S3,然后分析成本。取决于你想要的规模水平。

答案 1 :(得分:2)

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

少量缓存通常可以大大减少CPU负载。

您可以查看memcache

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

答案 2 :(得分:2)

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

附加优势是保持缓存条目的{hitcount,access of date,...}相对容易,并且其管理都可以在SQL中完成。

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

未缓存版本的成本估算:

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

缓存版本的成本估算:

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

如果你比较两者:

  • 未缓存版本的I / O成本较高(假设diff小于两个文件的总和)
  • 未缓存的版本总是有更大的内存占用
  • 查询成本可能小于差异执行成本。或者它可能更大......