2016-07-28 27 views
3

Wie implementiert man einen LRU Cache mit Erlang?Erlang LRU Cache

LRU Cache Wiki

Top Github-Projekt spielte war fogfish/cache, aber Segmented Tisch war nicht ganz fit für meine Daten.

barrel-db/erlang-lru wurde eine Liste verwendet. Nach dem Testen wäre es langsam, wenn zu viele Daten vorhanden wären.

Ich denke, das Problem war hier.

move_front(List, Key) -> [Key | lists:delete(Key, List)].

Mit Java, eine bessere Umsetzung wurde mit einem hashmap und LinkedListlike this

Ich versuchte, ein LinkedList zu tun, und dann realisiert, dass VerketteteListe nicht gute Idee für Erlang, like this thread.

ist die Frage, wie man einen LRU-Cache mit Erlang macht?

+0

Ich denke, Erlang zu tun niedrigen Level-Cache zu einem hohen Pegel ist und zur Zeit hat Erlang einige ähnliche Funktionen in Kern (wie ETS http://erlang.org/doc/man/ets.html), haben Sie also einige dieser Funktionen getestet, bevor Sie externe Projekte verwenden? –

+0

@MathieuK. Danke für Ihre Kommentare. Ja, ich habe es versucht. Das Schlüsselproblem ist LRU. Ich habe versucht, eine Tabelle zu verwenden, um die access_time zu speichern, aber für jedes Lesen/Update muss ich die Tabelle aktualisieren (löschen und einfügen). Ich frage mich, ob dies in einer besseren Methode gemacht werden könnte? – user3644708

+0

Ich habe keine Antwort auf Ihre Frage. Wenn Sie performanten LRU-Cache in Erlang implementieren möchten, ist einer der besten Ansätze, externen Code zu verwenden, der mit [ports] (http://erlang.org/doc/reference_manual/ports.html) oder [NIF] (http://erlang.org/doc/tutorial/nif.html). C-Programmierung ist nicht meine Lieblingsdomäne, aber wenn Sie ein Beispiel für die Implementierung von C-Code für Erlang haben möchten, können Sie [Strahlquellcode] (https://github.com/erlang/otp/tree/maint/erts/ Emulator/Strahl). –

Antwort

1

Die erste Implementierung von THE CACHE basierte auf ETS mit zwei Indizes. Eine ETS-Tabelle ist TTL -> Key Relation, eine andere ETS-Tabelle ist Key -> Object. Sie können die Implementierung bei

https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821

Die Wartung von zwei Index zu sehen war nicht effizient so segmentiert Cache outperform ursprüngliche Implementierung. Ich würde nicht empfehlen, pro-Objekt-TTL mit Erlang-Datenstrukturen zu implementieren, es sei denn, Sie können Ihre Daten innerhalb von Akteuren modellieren und Overhead akzeptieren. Es gibt eine Implementierung, um es anzugehen. Es wird verwendet Prozess pro Objekt Konzept:

https://github.com/fogfish/pts

Andernfalls müssen Sie NIF implementieren