mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-17 01:14:35 +08:00
add _get_value_size and remove _limit_flag
This commit is contained in:
@@ -45,13 +45,6 @@ class MemCacheUnit(abc.ABC):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.size_limit = kwargs.pop("size_limit", 0)
|
self.size_limit = kwargs.pop("size_limit", 0)
|
||||||
self.limit_type = kwargs.pop("limit_type", "length")
|
|
||||||
|
|
||||||
assert self.limit_type in ["length", "sizeof"], ValueError("limit_type shoule be one of ['length', 'sizeof']")
|
|
||||||
assert self.size_limit >= 0, ValueError("size_limit shoule not be negative.The default 0 means unlimited!")
|
|
||||||
|
|
||||||
# limit_flag: whether to popitem or not
|
|
||||||
self._limit_flag = 1 if self.size_limit > 0 else 0
|
|
||||||
self._size = 0
|
self._size = 0
|
||||||
self.od = OrderedDict()
|
self.od = OrderedDict()
|
||||||
|
|
||||||
@@ -66,9 +59,10 @@ class MemCacheUnit(abc.ABC):
|
|||||||
# move the key to end,make it latest
|
# move the key to end,make it latest
|
||||||
self.od.move_to_end(key)
|
self.od.move_to_end(key)
|
||||||
|
|
||||||
# pop the oldest items beyond size limit
|
if self.limited:
|
||||||
while self._size * self._limit_flag > self.size_limit:
|
# pop the oldest items beyond size limit
|
||||||
self.popitem(last=False)
|
while self._size > self.size_limit:
|
||||||
|
self.popitem(last=False)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
v = self.od.__getitem__(key)
|
v = self.od.__getitem__(key)
|
||||||
@@ -82,17 +76,15 @@ class MemCacheUnit(abc.ABC):
|
|||||||
return self.od.__len__()
|
return self.od.__len__()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"{self.__class__.__name__}<limit_type:{self.limit_type} size_limit:{self.size_limit if self.is_limited else 'no limit'} total_size:{self._size}>\n{self.od.__repr__()}"
|
return f"{self.__class__.__name__}<size_limit:{self.size_limit if self.limited else 'no limit'} total_size:{self._size}>\n{self.od.__repr__()}"
|
||||||
|
|
||||||
def set_limit_size(self, limit):
|
def set_limit_size(self, limit):
|
||||||
self.size_limit = limit
|
self.size_limit = limit
|
||||||
|
|
||||||
def set_limit(self, is_limited=True):
|
|
||||||
self._limit_flag = 1 if is_limited else 0
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_limited(self):
|
def limited(self):
|
||||||
return bool(self._limit_flag)
|
"""whether memory cache is limited"""
|
||||||
|
return self.size_limit > 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def total_size(self):
|
def total_size(self):
|
||||||
@@ -102,61 +94,43 @@ class MemCacheUnit(abc.ABC):
|
|||||||
self._size = 0
|
self._size = 0
|
||||||
self.od.clear()
|
self.od.clear()
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def _adjust_size(self, key, value):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def popitem(self, last=True):
|
def popitem(self, last=True):
|
||||||
raise NotImplementedError
|
k, v = self.od.popitem(last=last)
|
||||||
|
self._size -= self._get_value_size(v)
|
||||||
|
|
||||||
|
return k, v
|
||||||
|
|
||||||
|
def pop(self, key):
|
||||||
|
v = self.od.pop(key)
|
||||||
|
self._size -= self._get_value_size(v)
|
||||||
|
|
||||||
|
return v
|
||||||
|
|
||||||
|
def _adjust_size(self, key, value):
|
||||||
|
if key in self.od:
|
||||||
|
self._size -= sys.getsizeof(self.od[key])
|
||||||
|
|
||||||
|
self._size += self._get_value_size(value)
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def pop(self, key):
|
def _get_value_size(self, value):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
class MemCacheLengthUnit(MemCacheUnit):
|
class MemCacheLengthUnit(MemCacheUnit):
|
||||||
def __init__(self, size_limit=0):
|
def __init__(self, size_limit=0):
|
||||||
super().__init__(size_limit=size_limit, limit_type="length")
|
super().__init__(size_limit=size_limit)
|
||||||
|
|
||||||
def _adjust_size(self, key, value):
|
def _get_value_size(self, value):
|
||||||
if key not in self.od:
|
return 1
|
||||||
self._size += 1
|
|
||||||
|
|
||||||
def popitem(self, last=True):
|
|
||||||
k, v = self.od.popitem(last=last)
|
|
||||||
self._size -= 1
|
|
||||||
|
|
||||||
return k, v
|
|
||||||
|
|
||||||
def pop(self, key):
|
|
||||||
v = self.od.pop(key)
|
|
||||||
self._size -= 1
|
|
||||||
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
class MemCacheSizeofUnit(MemCacheUnit):
|
class MemCacheSizeofUnit(MemCacheUnit):
|
||||||
def __init__(self, size_limit=0):
|
def __init__(self, size_limit=0):
|
||||||
super().__init__(size_limit=size_limit, limit_type="sizeof")
|
super().__init__(size_limit=size_limit)
|
||||||
|
|
||||||
def _adjust_size(self, key, value):
|
def _get_value_size(self, value):
|
||||||
if key in self.od:
|
return sys.getsizeof(value)
|
||||||
self._size = self._size - sys.getsizeof(self.od[key]) + sys.getsizeof(value)
|
|
||||||
else:
|
|
||||||
self._size += sys.getsizeof(value)
|
|
||||||
|
|
||||||
def popitem(self, last=True):
|
|
||||||
k, v = self.od.popitem(last=last)
|
|
||||||
self._size -= sys.getsizeof(v)
|
|
||||||
|
|
||||||
return k, v
|
|
||||||
|
|
||||||
def pop(self, key):
|
|
||||||
v = self.od.pop(key)
|
|
||||||
self._size -= sys.getsizeof(v)
|
|
||||||
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
class MemCache:
|
class MemCache:
|
||||||
|
|||||||
Reference in New Issue
Block a user