Python中如何实现内存感知的LRU缓存?

19 投票
1 回答
6270 浏览
提问于 2025-04-18 05:26

我在用Python 3自带的functools.lru_cache装饰器来缓存一些计算量大的函数。我的目标是尽可能多地缓存调用,但又不想占用太多内存,因为缓存太多值会导致内存使用不稳定。

在Python中,有没有推荐的技巧或库来实现这个目标呢?

比如,这个问题让我找到了一个Go语言的库,专门用于根据系统内存情况进行LRU缓存。如果Python也有类似的东西就好了。


注意:我不能仅仅通过估算每个值占用的内存来设置maxsize,因为多个进程会同时调用这个装饰过的函数;所以解决方案需要能够动态检查当前有多少内存是空闲的。

1 个回答

22

我最终修改了内置的 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

撰写回答