这是一个相当抽象的问题,我希望它在界限内。
我在网络开发方面的编程生涯已经有5个月了。我发现CPU和存储资源之间经常存在紧张关系。简而言之,您可以使用较少的一个或多个,反之亦然(然后投入速度考虑)。我现在已经开始部署我的第一个应用程序用于生产,所以这个平衡现在是真正的美元和美分的问题。问题是:我真的没有任何想法我应该寻找什么样的平衡。
这里有一些显着的例子,可以说明在不同情况下可以达到的平衡。
背景
我正在开发一个应用程序,它在文本之间有很多差异。用户将调用包含html中显示的差异的页面。很多。
第一个案例
我应该在每次显示页面时运行差异,还是应该运行差异一次,存储它,并在每次显示页面时调用它?
第二种情况
我编写了一个汇总差异的算法。这是大约110行代码,它使用4或5个循环和子循环。同样,我应该运行一次并存储结果,以便以后可以调用它们,或者我应该在每次显示页面时运行算法吗?
也很想听听您对用于量化平衡的最佳工具的看法。
答案 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 将在内存中,而长尾将位于磁盘上。并且总是可以增加或缩小缓存。
未缓存版本的成本估算:
缓存版本的成本估算:
如果你比较两者: