Source code for gptcache.manager.eviction.memory_cache
from typing import Any, Callable, List
import cachetools
from gptcache.manager.eviction.base import EvictionBase
[docs]def popitem_wrapper(func, wrapper_func, clean_size):
def wrapper(*args, **kwargs):
keys = []
try:
keys = [func(*args, **kwargs)[0] for _ in range(clean_size)]
except KeyError:
pass
wrapper_func(keys)
return wrapper
[docs]class MemoryCacheEviction(EvictionBase):
"""eviction: Memory Cache
:param policy: eviction strategy
:type policy: str
:param maxsize: the maxsize of cache data
:type maxsize: int
:param clean_size: will clean the size of data when the size of cache data reaches the max size
:type clean_size: int
:param on_evict: the function for cleaning the data in the store
:type on_evict: Callable[[List[Any]], None]
"""
def __init__(
self,
policy: str,
maxsize: int,
clean_size: int = 0,
on_evict: Callable[[List[Any]], None] = None,
**kwargs,
):
self._policy = policy.upper()
if self._policy == "LRU":
self._cache = cachetools.LRUCache(maxsize=maxsize, **kwargs)
elif self._policy == "LFU":
self._cache = cachetools.LFUCache(maxsize=maxsize, **kwargs)
elif self._policy == "FIFO":
self._cache = cachetools.FIFOCache(maxsize=maxsize, **kwargs)
elif self._policy == "RR":
self._cache = cachetools.RRCache(maxsize=maxsize, **kwargs)
else:
raise ValueError(f"Unknown policy {policy}")
self._cache.popitem = popitem_wrapper(self._cache.popitem, on_evict, clean_size)
[docs] def put(self, objs: List[Any]):
for obj in objs:
self._cache[obj] = True
[docs] def get(self, obj: Any):
return self._cache.get(obj)
@property
def policy(self) -> str:
return self._policy