def testLRU(): print ('######### LRU ########\n') lru = LRU(5) for i in range(8): lru.put(str(i), i) if i == 5: lru.get(str(i)) lru.remove('3') lru.showNodes()
def random_read(lru_len=100,times=20000): key_list=get_random_int(0,1500,times) lru_obj=LRU(lru_len) for key in key_list: lru_obj.put(key,key) beg_time=time.time() for key in key_list: lru_obj.get(key) end_time=time.time() print("测试随机读操作{}次,lru_len长度为{},情况下耗时{} ".format(times,lru_len,end_time-beg_time)) time.time()
def random_wirte(lru_len=100,times=20000): """ [测试随机写操作] Keyword Arguments: times {int} -- [本轮测试次数] (default: {20000}) """ key_list=get_random_int(0,1500,times) lru_obj=LRU(lru_len) beg_time=time.time() for key in key_list: lru_obj.put(key,key) end_time=time.time() print("测试随机写操作{}次,lru_len长度为{},情况下耗时{} ".format(times,lru_len,end_time-beg_time)) time.time()
def random_read_write(lru_len=100,times=20000): """ 随机读写 """ key_list=get_random_int(0,1500,times) lru_obj=LRU(lru_len) beg_time=time.time() for index,key in enumerate(key_list): if index%2==0: lru_obj.put(key,key) else: lru_obj.get(key) end_time=time.time() print("测试随机读写操作{}次,lru_len长度为{},情况下耗时{} ".format(times,lru_len,end_time-beg_time)) time.time()
class Cache: # Replacement policies LRU = "LRU" FIFO = 'FIFO' def __init__(self, name, size, policy): self.name = name self.size = size self.free_space = size self.policy = policy # Eviction policy self.hashmap = {} # Mapping <objname,objsize> if (self.policy == Cache.LRU): self.cache = LRU(self.size) elif (self.policy == Cache.FIFO): self.cache = queue.Queue(maxsize=self.size) # Statistics self.hit_count = 0 self.miss_count = 0 def has_key(self, key): if key in self.hashmap.keys(): return True else: return False def update(self, key, size): self.hashmap[key] = size self.hit_count += 1 if (self.policy == Cache.LRU): self.cache.update(key=size) elif (self.policy == Cache.FIFO): self.cache.put(key) def insert(self, key, size, directory): if (self.policy == Cache.LRU): self.insertLRU(key, size, directory) elif (self.policy == Cache.FIFO): self.insertFIFO(key, size, directory) def evictLRU(self, directory): oid = self.cache.peek_last_item()[0] directory.removeBlock(oid, self.name) del [oid] del self.hashmap[oid] self.free_space += int(self.hashmap[oid]) def evictFIFO(self, directory): oid = self.cache.get() directory.removeBlock(oid, self.name) self.free_space += int(self.hashmap[oid]) del self.hashmap[oid] def insertLRU(self, key, size, directory): while (int(size) >= self.free_space): self.evictLRU(directory) self.cache[key] = size self.hashmap[key] = size self.free_space += size self.miss_count += 1 def insertFIFO(self, key, size, directory): while (int(size) >= self.free_space): self.evictFIFO(directory) self.cache.put(key) self.hashmap[key] = size self.free_space += size self.miss_count += 1 def put(self, key, size, directory): if self.has_key(key): self.update(key, size) else: self.insert(key, size, directory) def print(self): if (self.policy == Cache.LRU): print(self.name, "LRU", self.hashmap, self.cache.items()) elif (self.policy == Cache.FIFO): print(self.name, "LRU", self.hashmap, list(self.cache.queue)) def remove(self, key): del self.hashmap[key] if (self.policy == Cache.LRU): del self.cache[key] elif (self.policy == Cache.FIFO): a = 5