summaryrefslogtreecommitdiff
path: root/pysnmp/cache.py
diff options
context:
space:
mode:
authorelie <elie>2011-01-23 09:04:39 +0000
committerelie <elie>2011-01-23 09:04:39 +0000
commit46ca31651187d542f69301485ef6440ee4566b4a (patch)
tree31547b831fd3d470ac40a31d858db9997c8bf8fa /pysnmp/cache.py
parent542177f8fd86bbd59a161045cc61a130b3ec4026 (diff)
downloadpysnmp-git-46ca31651187d542f69301485ef6440ee4566b4a.tar.gz
cache MIB columnar objects instance ID <-> symbolic representation mapping
for performance reasons
Diffstat (limited to 'pysnmp/cache.py')
-rw-r--r--pysnmp/cache.py37
1 files changed, 37 insertions, 0 deletions
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