14

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

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

例如,这个问题让我想到了一个用于系统内存感知 LRU 缓存的 Go 库。与 Python 类似的东西将是理想的。


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

4

1 回答 1

19

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

于 2014-05-05T21:05:28.890 回答