【问题标题】:Will using memcache reduce my instance memory?使用 memcache 会减少我的实例内存吗?
【发布时间】:2015-04-22 18:48:41
【问题描述】:

由于内存使用率高,我目前在我的 Google App Engine 应用上遇到软内存错误。许多大型对象正在使内存使用率飙升。

我想如果我设置并从 memcache 中调用它们,可能会减少整体内存使用量。通读文档似乎并非如此,而且 memcache 的好处是减少 HRD 查询。

memcache 对整体内存的影响是正面还是负面?

编辑:我知道我可以将实例类升级到 F2,但我正在尝试查看是否可以在减少内存的同时保持成本最低。

【问题讨论】:

    标签: python-2.7 google-app-engine memcached


    【解决方案1】:

    除非您在 Java 代码中销毁这些对象或清空集合,否则将对象移入和移出 Memcache 不会影响您的内存。

    更大的问题是 memcache 实体被限制为 1MB,并且 memcache 无法保证。这些限制中的第一个意味着您不能将非常大的对象推送到 Memcache 中。

    第二个限制意味着你不能轻易地替换,例如,用 memcache 替换 HashMap - 无法判断 getValue() 是否返回 null 是因为对象不存在还是因为它被撞出 memcache。因此,您每次都必须对数据存储区进行额外调用,以查看对象是否真的不存在。

    【讨论】:

    • 这通常是正确的,我可以看到 memcache 可以提供帮助的情况。如果代码使用大量内存来计算一个小的结果,那么结果可能会被缓存,从而减少计算它的需要并减少内存使用。如果问题对场景不那么模糊,那么提供替代方案会更容易
    • 我不确定缓存一个小对象(结果)如何减少内存使用。通常,当您必须将大量数据读入内存并且直到最后都不能丢弃时,您需要大量内存。我同意有很多方法可以减少内存使用,尤其是在涉及循环和集合的情况下。
    • 谢谢两位。我的场景是我有很多请求来读取同一个 blob 而不更改它。在许多请求中一遍又一遍地加载它似乎会使内存使用量超过 128mb
    • Re andrei,因为您节省了从可能占用大量内存的源重新计算值。如果您有许多同时请求并且正在生成它的副本,则 OP 应该考虑将对象保留在全局内存中(适当考虑对同一实例的并行请求)。
    • 您的实现中似乎存在内存泄漏。多次加载相同的 blob 应该不会对超出最大并行请求数的内存产生影响,并且使用 Memcache 很可能会在您的场景中有所帮助 - 不是内存,而是加快响应时间。阅读 blob 时检查是否关闭了阅读器,并考虑使用全局静态变量以确保实例内存中只有一个副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2011-09-06
    • 2013-05-21
    • 2019-04-20
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多