MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Python:budowanie pamięci podręcznej LRU

Pamięć podręczna LRU w Python3.3 ma wstawianie, usuwanie i wyszukiwanie O(1).

Projekt wykorzystuje okrągłą, podwójnie powiązaną listę wpisów (ułożonych od najstarszego do najnowszego) oraz tablicę mieszającą do lokalizacji poszczególnych linków. Trafienia w pamięci podręcznej wykorzystują tablicę mieszającą, aby znaleźć odpowiedni link i przenieść go na początek listy. Braki w pamięci podręcznej usuwają najstarszy link i tworzą nowy link na początku połączonej listy.

Oto uproszczona (ale szybka) wersja w 33 liniach bardzo prostego Pythona (używająca tylko prostych operacji słownikowych i listowych). Działa na Python 2.0 i nowszych (lub PyPy lub Jython lub Python3.x):

class LRU_Cache:

    def __init__(self, original_function, maxsize=1024):
        # Link structure: [PREV, NEXT, KEY, VALUE]
        self.root = [None, None, None, None]
        self.root[0] = self.root[1] = self.root
        self.original_function = original_function
        self.maxsize = maxsize
        self.mapping = {}

    def __call__(self, *key):
        mapping = self.mapping
        root = self.root
        link = mapping.get(key)
        if link is not None:
            link_prev, link_next, link_key, value = link
            link_prev[1] = link_next
            link_next[0] = link_prev
            last = root[0]
            last[1] = root[0] = link
            link[0] = last
            link[1] = root
            return value
        value = self.original_function(*key)
        if len(mapping) >= self.maxsize:
            oldest = root[1]
            next_oldest = oldest[1]
            root[1] = next_oldest
            next_oldest[0] = root
            del mapping[oldest[2]]
        last = root[0]
        last[1] = root[0] = mapping[key] = [last, root, key, value]
        return value


if __name__ == '__main__':
    p = LRU_Cache(ord, maxsize=3)
    for c in 'abcdecaeaa':
        print(c, p(c))

Począwszy od Pythona 3.1, OrderedDict sprawia, że ​​implementacja pamięci podręcznej LRU jest jeszcze prostsza:

from collections import OrderedDict

class LRU_Cache:

    def __init__(self, original_function, maxsize=1024):
        self.original_function = original_function
        self.maxsize = maxsize
        self.mapping = OrderedDict()

    def __call__(self, *key):
        mapping = self.mapping
        try:
            value = mapping[key]
            mapping.move_to_end(key)
        except KeyError:
            value = self.original_function(*key)
            if len(mapping) >= self.maxsize:
                mapping.popitem(False)
            mapping[key] = value
        return value


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kiedy próbuję użyć Hibernate ogm i spring boot, konsola wyświetla komunikat o błędzie Nie można utworzyć wystąpienia nazwanej klasy strategii

  2. tworzenie formularza rejestracji i logowania w node.js i mongodb

  3. MongoDB 3.6 jak przekonwertować ciąg na identyfikator obiektu

  4. Oczekujące żądanie post api punktu końcowego w narzędziu deweloperskim

  5. django-nonrel wyklucza pole listy z admin