From 6d102d81322b1fbf2f1af0c2213051d4cb994246 Mon Sep 17 00:00:00 2001 From: Phileas Date: Sun, 2 Jun 2019 21:04:09 -0400 Subject: [PATCH 1/3] Page replacement algorithm, LRU --- paging/LRU.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 paging/LRU.py diff --git a/paging/LRU.py b/paging/LRU.py new file mode 100644 index 000000000000..59cc84f828fe --- /dev/null +++ b/paging/LRU.py @@ -0,0 +1,62 @@ +from abc import abstractmethod +import sys +from collections import deque + +class LRUCache: + """ Page Replacement Algorithm, Least Recently Used (LRU) Caching.""" + + dq_store = object() # Cache store of keys + key_reference_map = object() # References of the keys in cache + _MAX_CAPACITY: int = 10 # Maximum capacity of cache + + @abstractmethod + def __init__(self, n: int): + """ Creates an empty store and map for the keys. + The LRUCache is set the size n. + """ + self.dq_store = deque() + self.key_reference_map = set() + if not n: + LRUCache._MAX_CAPACITY = sys.maxsize # n is None, set to maxsize. + elif n < 1: + raise ValueError('n should be an integer greater than 1.') + else: + LRUCache._MAX_CAPACITY = n + + def refer(self, x): + """ + Looks for a page in the cache store and adds reference to the set. + Remove the least recently used key if the store is full. + Update store to reflect recent access. + """ + if x not in self.dq_store: + if len(self.dq_store) == LRUCache._MAX_CAPACITY: + last_element = self.dq_store.pop() + self.key_reference_map.remove(last_element) + else: + index_remove = 0 + for ix, key in enumerate(self.dq_store): + if key == x: + index_remove = ix + break + self.dq_store.remove(index_remove) + + self.dq_store.appendleft(x) + self.key_reference_map.add(x) + + def display(self): + """ + Prints all the elements in the store. + """ + for k in self.dq_store: + print(k) + +if __name__ == "__main__": + lru_cache = LRUCache(4) + lru_cache.refer(1) + lru_cache.refer(2) + lru_cache.refer(3) + lru_cache.refer(1) + lru_cache.refer(4) + lru_cache.refer(5) + lru_cache.display() From e4040f7e4ab68550f88b6f9f477a7cdc201535c5 Mon Sep 17 00:00:00 2001 From: Phileas Date: Mon, 3 Jun 2019 01:36:27 -0400 Subject: [PATCH 2/3] small rectifications --- paging/LRU.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/paging/LRU.py b/paging/LRU.py index 59cc84f828fe..2932e9c185e8 100644 --- a/paging/LRU.py +++ b/paging/LRU.py @@ -17,9 +17,9 @@ def __init__(self, n: int): self.dq_store = deque() self.key_reference_map = set() if not n: - LRUCache._MAX_CAPACITY = sys.maxsize # n is None, set to maxsize. - elif n < 1: - raise ValueError('n should be an integer greater than 1.') + LRUCache._MAX_CAPACITY = sys.maxsize + elif n < 0: + raise ValueError('n should be an integer greater than 0.') else: LRUCache._MAX_CAPACITY = n @@ -29,15 +29,15 @@ def refer(self, x): Remove the least recently used key if the store is full. Update store to reflect recent access. """ - if x not in self.dq_store: + if x not in self.key_reference_map: if len(self.dq_store) == LRUCache._MAX_CAPACITY: last_element = self.dq_store.pop() self.key_reference_map.remove(last_element) else: index_remove = 0 - for ix, key in enumerate(self.dq_store): + for idx, key in enumerate(self.dq_store): if key == x: - index_remove = ix + index_remove = idx break self.dq_store.remove(index_remove) From a76f3b4372ce5f58edd63acc8460f8cb9aadb1ee Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 28 Oct 2019 13:46:03 +0100 Subject: [PATCH 3/3] Rename paging/LRU.py to other/least_recently_used.py --- paging/LRU.py => other/least_recently_used.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename paging/LRU.py => other/least_recently_used.py (100%) diff --git a/paging/LRU.py b/other/least_recently_used.py similarity index 100% rename from paging/LRU.py rename to other/least_recently_used.py