我正在使用 Python 3 的内置functools.lru_cache
装饰器来记忆一些昂贵的功能。我想在不使用太多内存的情况下记住尽可能多的调用,因为缓存太多的值会导致抖动。
是否有首选技术或库可以在 Python 中完成此任务?
例如,这个问题让我想到了一个用于系统内存感知 LRU 缓存的 Go 库。与 Python 类似的东西将是理想的。
注意:我不能只估计每个值使用的内存并进行maxsize
相应设置,因为多个进程将并行调用修饰函数;解决方案需要实际动态检查有多少内存可用。
我正在使用 Python 3 的内置functools.lru_cache
装饰器来记忆一些昂贵的功能。我想在不使用太多内存的情况下记住尽可能多的调用,因为缓存太多的值会导致抖动。
是否有首选技术或库可以在 Python 中完成此任务?
例如,这个问题让我想到了一个用于系统内存感知 LRU 缓存的 Go 库。与 Python 类似的东西将是理想的。
注意:我不能只估计每个值使用的内存并进行maxsize
相应设置,因为多个进程将并行调用修饰函数;解决方案需要实际动态检查有多少内存可用。
我最终修改了内置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