Python中如何实现内存感知的LRU缓存?
我在用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