Gibt es eine LRU-Implementierung von IDictionary?
Ich würde gerne eine einfache Implementierung in-memory-LRU-cache-system, und ich dachte an eine Lösung auf der Basis einer IDictionary-Implementierung, die verarbeiten könnte eine Hash LRU-Mechanismus.
Aus java, ich habe Erfahrungen mit LinkedHashMap
, die funktioniert gut für was ich brauche: ich kann nicht finden überall eine ähnliche Lösung für .NET.
Jemand hat es entwickelt, oder hat jemand schon Erfahrungen wie diese?
InformationsquelleAutor der Frage Antonello | 2009-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nichts in der base-class-Bibliotheken, die dies tut.
Auf die freie Seite, vielleicht so etwas wie C5 ist HashedLinkedList funktionieren würde.
Wenn Sie bereit sind zu zahlen, vielleicht check out diese C# - toolkit. Es enthält eine Implementierung.
InformationsquelleAutor der Antwort Reed Copsey
Dies eine sehr einfache und schnelle Umsetzung entwickelten wir eine Website, die wir besitzen.
Wir versuchen, den code zu verbessern, so viel wie möglich, aber halten Sie thread-sicher.
Ich denke, der code ist sehr einfach und klar, aber wenn Sie eine Erklärung brauchen oder eine Anleitung, wie es zu benutzen, zögern Sie nicht zu Fragen.
InformationsquelleAutor der Antwort
Finden Sie Antwort beim googeln auch gefunden:
http://code.google.com/p/csharp-lru-cache/
InformationsquelleAutor der Antwort mcintyre321
Ich habe kürzlich eine Klasse namens LurchTable um die Notwendigkeit für eine C# - Variante der LinkedHashMap. Eine kurze Diskussion der LurchTable finden Sie hier.
Basic features:
Source Code: http://csharptest.net/browse/src/Library/Collections/LurchTable.cs
GitHub: https://github.com/csharptest/CSharpTest.Net.Collections
HTML-Hilfe: http://help.csharptest.net/
InformationsquelleAutor der Antwort csharptest.net
Glaube ich nicht so. Ich habe sicherlich gesehen, hand-gerollte diejenigen implementiert, die mehrmals in verschiedenen, nicht verwandten Projekten (die sich mehr oder weniger bestätigt dies. Wenn es eines gab, sicher mindestens eines der Projekte, würde es benutzt haben).
Es ist ziemlich einfach zu implementieren, und in der Regel bekommt erfolgt durch erstellen einer Klasse, die enthält sowohl eine
Dictionary
und einList
.Den Tasten wechseln Sie in die Liste (in-order), und die Gegenstände gehen in das Wörterbuch.
Wenn Sie ein neues Element Hinzufügen, um die Sammlung, prüft die Funktion die Länge der Liste, zieht den letzten Schlüssel (wenn es zu lange) und dann evicts den Schlüssel und den Wert aus dem dictionary zu entsprechen. Nicht viel mehr, um es wirklich
InformationsquelleAutor der Antwort Orion Edwards
Den Caching Application Block von EntLib hat eine LRU-Aufräumvorgang option out of the box und können im Speicher sein. Vielleicht ist es ein bisschen Schwergewicht für das, was Sie wollen, tho.
InformationsquelleAutor der Antwort JP Alioto
Ich mag Lawrence Umsetzung. Hashtable + LinkedList ist eine gute Lösung.
In Bezug auf threading würde ich nicht sperren diese [MethodImpl(MethodImplOptions.Synchronized)], sondern mit ReaderWriterLockSlim oder spin-lock (da Konflikte in der Regel schnell), statt.
In der get-Funktion würde ich prüfen, ob es bereits das 1. Element zuerst, anstatt immer das entfernen und hinzufügen. Dies gibt Ihnen die Möglichkeit, innerhalb einer Lesesperre, die nicht blockiert andere Leser.
InformationsquelleAutor der Antwort Jerry Ju
Dieser nimmt Martin's code mit Mr T's Anregungen und macht es Stylecop freundlich. Oh, es erlaubt auch für die Entsorgung von Werten, wie Sie Zyklus, die aus dem cache.
InformationsquelleAutor der Antwort mheyman
Wenn es ein asp.net app können Sie die cache-Klasse[1], doch werden Sie im Wettbewerb um Raum mit anderen zwischengespeicherten Sachen, die können sein was Sie wollen, oder nicht.
[1] http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx
InformationsquelleAutor der Antwort Tony Lee