2011-01-14 11 views
5

Ich suche Caching auf einem Windows-Desktop-Anwendung in C# geschrieben hinzuzufügen 4.Lokale Cache-Bibliothek C# (persistent und verschlüsselt)

Meine Anforderungen sind für einen persistenten Schlüssel-Wert-Speicher, der auf eine verschlüsselte Datei speichert. Ich versuche, Remoteaufrufe zu einem Server zu cachen, die möglicherweise langsam — sind und eine beträchtliche Menge von Daten cachen können, d. H. 50 MB. Ich möchte in der Lage sein, einen Wert für maximale Dateigröße mit einer bestimmten Form von LRU-Ablauf festzulegen.

Ich hatte daran gedacht, ein Wörterbuch zu serialisieren, aber es ist wahrscheinlich, dass es ein wenig langsam ist, es zu initialisieren, und es wird einen zu großen Speicherbedarf haben.

Ich denke, eine verschlüsselte SQLCE 4-Datenbank könnte die beste Lösung sein, aber das scheint Schwergewicht, wenn ich wirklich nur eine einzige Hash-Tabelle wollen. Es bietet auch nicht standardmäßig die Caching-Typ-Funktionen von Ablauf etc ..

Kann jemand vorschlagen, alles andere überdenken, oder einen Vorschlag zur Optimierung der Serialisierung/Deserialisierung.

+0

Haben Sie experimentiert mit nur dem Dictionary serialisieren? Meiner Erfahrung nach ist die Datei-Deserialisierung normalerweise sehr schnell. –

+0

Ich habe nicht - der Speicheraufwand von einem 50MB + Wörterbuch ist mein Anliegen vor perf – Chris

+0

Checkout: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) -Klasse –

Antwort

0

Sie können gerne unsere SolFS Bibliothek ansehen. Dies ist ein virtuelles Dateisystem, in dem Sie Ihre Daten in Dateien ablegen und den Schlüssel als Dateinamen verwenden. "Abgelaufene" Dateibereinigung muss jedoch in Ihrem Code ausgeführt werden. SolFS bietet integrierte Verschlüsselung (und Sie können Ihre eigenen Verschlüsselungsmechanismen hinzufügen) und ist in der Lage, große Dateien zu halten (mehrere GB pro Datei ist völlig in Ordnung). Darüber hinaus verfügt SolFS auch über eine integrierte Komprimierung, wenn Sie Wert auf die Dateigröße legen.

0

Um die Serialisierung zu optimieren, können Sie Ihre eigene Serialisierungsmethode erstellen, indem Sie die Schnittstelle ISerializable implementieren und sie in XML oder JSon oder was auch immer verwandeln.

1

Sie sollten unbedingt in Betracht ziehen Serialisierung. Ich ging das hin und her (einschließlich SQLCE versuchen) vor ein paar Monaten und es gab nichts in der Nähe der Geschwindigkeit von serialisierten Objekten (in meinem Fall benutzte ich benutzerdefinierte Objekte) - SQLCE dauerte 2-3 mal so lange wie serialisiert zu laden Objekte.

Wenn der Speicherbedarf zu groß ist, sollten Sie erneut darüber nachdenken, wie Sie das entwerfen, was Sie beibehalten.

1

Ich würde empfehlen, SQLite über SQLCE 4. Die SQLlite-Engine ist explizit entworfen, um in speicherbeschränkten Umgebungen zu arbeiten. Die Entscheidung über Speicher und Geschwindigkeit bleibt dem Entwickler überlassen.

Die open source ADO.NET library ermöglicht es Ihnen, die Microsoft-Datenbank-Tools (DbProviderFactory, Entity Framework, Server Explorer usw.) in vollem Umfang zu nutzen. Es unterstützt auch nativ die Verschlüsselung.

Die LRU Implementierung würde ziemlich einfach ein Schema wie folgt gegeben sein:

CREATE TABLE "cache" ("key" varchar(64) NOT NULL PRIMARY KEY, "value" text NOT NULL, "last_access" datetime NOT NULL); 
CREATE INDEX "cache_lru" ON "cache" ("last_access"); 
0

Eine Kombination aus protobuf-net und File encryption in .NET nützlich sein können.

Sie können protobuf-net zu serialisieren/deserialze schnell verwenden. (Ein Beispiel für die Beibehaltung eines 'Person' -Objekts in einer Binärdatei finden Sie in der Kurzanleitung.) protobuf hat auch Methoden, die ein Byte [] zurückliefern, so dass Sie diese an die Krypto übergeben können, um zu vermeiden, den Byte-Stream wieder einzulesen.