【问题标题】:Memory-aware LRU caching in Python?Python中的内存感知LRU缓存?
【发布时间】:2014-06-22 00:55:56
【问题描述】:

我正在使用 Python 3 的内置 functools.lru_cache 装饰器来记忆一些昂贵的功能。我想在不使用太多内存的情况下记住尽可能多的调用,因为缓存太多的值会导致抖动。

是否有首选的技术或库可以在 Python 中完成此任务?

例如,this question 将我带到 system memory aware LRU caching 的 Go 库。对 Python 来说类似的东西是理想的。


注意:我不能只估计每个值使用的内存并相应地设置maxsize,因为多个进程将并行调用修饰函数;解决方案需要实际动态检查有多少可用内存。

【问题讨论】:

  • 如果您还没有找到可以做到这一点的东西,您可以尝试利用 psutil (code.google.com/p/psutil) 自行开发。
  • 是的,这就是我现在正在研究的内容——事实上,您是否知道如何找到 Python 3 的 lru_cache 实现的源代码?最简单的方法是简单地检查装饰器中的内存使用情况。这肯定会增加一些开销,但在这个应用程序中,我认为这不会很重要。
  • 或本地:启动交互式 Python 解释器 import functools 并输入模块名称 functools。适用于任何定位几乎所有 Python 模块的源代码(当然 C 扩展除外)。
  • @Will BTW,functools.lru_cache 是由 Raymond Hettinger 编写的。他发布了几个不同的(LRU)缓存/记忆recipes,也许你可以在其中找到一些有用或至少鼓舞人心的东西;-)

标签: python caching memory-management lru


【解决方案1】:

我最终修改了内置的lru_cache 以使用psutil

修改后的装饰器采用额外的可选参数use_memory_up_to。如果设置,如果可用内存少于use_memory_up_to 字节(根据psutil.virtual_memory().available),缓存将被视为已满。例如:

from .lru_cache import lru_cache

GB = 1024**3

@lru_cache(use_memory_up_to=(1 * GB))
def expensive_func(args):
    ...

注意:设置use_memory_up_to会导致maxsize无效。

这是代码:lru_cache.py

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2011-06-17
    • 2011-05-25
    • 2014-02-14
    • 2013-08-02
    • 1970-01-01
    • 2011-12-30
    • 2011-03-02
    • 2014-12-30
    相关资源
    最近更新 更多