From 46ca31651187d542f69301485ef6440ee4566b4a Mon Sep 17 00:00:00 2001 From: elie Date: Sun, 23 Jan 2011 09:04:39 +0000 Subject: cache MIB columnar objects instance ID <-> symbolic representation mapping for performance reasons --- pysnmp/cache.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 pysnmp/cache.py (limited to 'pysnmp/cache.py') diff --git a/pysnmp/cache.py b/pysnmp/cache.py new file mode 100644 index 00000000..4023c460 --- /dev/null +++ b/pysnmp/cache.py @@ -0,0 +1,37 @@ +# Limited-size dictionary class to use for caches + +class Cache: + def __init__(self, maxSize=256): + self.__maxSize = maxSize + self.__size = 0 + self.__chopSize = maxSize/10 + self.__chopSize = self.__chopSize and self.__chopSize or 1 + self.__cache = {} + self.__usage = {} + + def __contains__(self, k): return k in self.__cache + + def __getitem__(self, k): + self.__usage[k] = self.__usage[k] + 1 + return self.__cache[k] + + def __len__(self): return self.__size + + def __setitem__(self, k, v): + if self.__size >= self.__maxSize: + keys = self.__usage.keys() + keys.sort(lambda x,y,d=self.__usage: cmp(d[x],d[y])) + print keys[:self.__chopSize] + for _k in keys[:self.__chopSize]: + del self.__cache[_k] + del self.__usage[_k] + self.__size = self.__size - self.__chopSize + if k not in self.__cache: + self.__size = self.__size + 1 + self.__usage[k] = 0L + self.__cache[k] = v + + def __delitem__(self, k): + del self.__cache[k] + del self.__usage[k] + self.__size = self.__size - 1 -- cgit v1.2.1