Python: Erstellen eines LRU-Caches

7

Ich habe ungefähr 6,00,000 entries in MongoDB im folgenden Format:

%Vor%

wo

  • feature könnte ein beliebiges Wort sein,
  • Kategorie ist positiv oder negativ und
  • Anzahl gibt an, wie oft ein Feature in einem Dokument für diese Kategorie aufgetreten ist.

Ich möchte die Top 1000 Tupel zwischenspeichern, sagen wir mal, um Datenbank nicht jedes Mal abzufragen.

Wie erstellt man in Python einen LRU-Cache? Oder gibt es dafür bekannte Lösungen?

    
daydreamer 14.12.2010, 20:32
quelle

4 Antworten

17

Der LRU-Cache in Python3.3 hat O (1) -Einfügung, Löschung und suchen.

Der Entwurf verwendet eine kreisförmige doppelt verknüpfte Liste von Einträgen (angeordnet älteste zu neuesten) und eine Hash-Tabelle, um einzelne Verknüpfungen zu finden. Cache-Treffer verwenden die Hash-Tabelle, um den relevanten Link zu finden und ihn an den Anfang der Liste zu verschieben. Cache-Fehler löschen den ältesten Link und erstellen einen neuen Link am Anfang der verknüpften Liste.

Hier ist eine vereinfachte (aber schnelle) Version in 33 Zeilen von sehr einfachem Python (nur einfache Wörterbuch- und Listenoperationen verwendend). Es läuft auf Python 2.0 und höher (oder PyPy oder Jython oder Python3.x):

%Vor%     
Raymond Hettinger 30.11.2011 19:20
quelle
5

Neben der in Python 3.2 enthaltenen Version gibt es im Python-Kochbuch LRU-Cache-Rezepte, einschließlich diese von Python-Core-Entwickler Raymond Hettinger.

    
Ned Deily 14.12.2010 21:13
quelle
3

Python 3.2 functools enthält einen LRU-Cache . Sie können es leicht aus repo auswählen und prüfen, ob Sie es anpassen müssen arbeite mit Python 2 (sollte nicht zu schwer sein - vielleicht itertools anstelle von bestimmten eingebauten - fragen Sie, wenn Sie Hilfe brauchen) und fertig sein. Sie müssen die Abfrage in eine aufrufbare Datei umbrechen und sicherstellen, dass sie von den (hashbaren) Funktionsargumenten abhängt.

    
delnan 14.12.2010 20:40
quelle
1

Es gibt auch Backports der Python 3.3-Version von lru_cache wie das , das auf Python 2.7 läuft. Wenn Sie an zwei Caching-Schichten interessiert sind (falls nicht in der Instanz zwischengespeichert, wird ein geteilter Cache geprüft), habe ich lru2cache erstellt auf dem Backport von lru_cache.

    
mjbrams 02.02.2016 22:34
quelle

Tags und Links