2011-01-14 16 views
5

Sto cercando di aggiungere il caching ad un'applicazione desktop di Windows scritto in C# 4.locale Cache Biblioteca C# (persistente e criptato)

miei requisiti sono per un negozio di valori-chiave persistente che salva in un file crittografato. Sto tentando di memorizzare le chiamate remote su un server potenzialmente lento — e potrebbe memorizzare una quantità considerevole di dati nella cache, ovvero 50+ MB. Mi piacerebbe essere in grado di impostare un valore di dimensione massima del file con qualche forma di scadenza LRU.

Avevo pensato di serializzare un dizionario, ma è probabile che sia un po 'lento da inizializzare e avrà un ingombro di memoria troppo grande.

Sto pensando che un database SQLCE 4 crittografato potrebbe essere la soluzione migliore, ma sembra pesante quando desidero solo una singola tabella hash. Inoltre non offre in modo nativo le funzionalità di tipo caching della scadenza, ecc.

Qualcuno può suggerire qualcos'altro che valga la pena considerare, o qualche suggerimento sull'ottimizzazione della serializzazione/deserializzazione.

+0

Hai mai provato a serializzare il dizionario? Nella mia esperienza, la deserializzazione dei file è normalmente molto veloce. –

+0

Non ce l'ho - il sovraccarico di memoria di un dizionario da 50 MB + è la mia preoccupazione prima del perf – Chris

+0

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

risposta

0

Siete invitati a consultare la nostra libreria SolFS. Questo è un file system virtuale, in cui si inseriscono i dati in file e si utilizza la chiave come nome del file. La pulizia del file "scaduta" deve essere eseguita nel codice, però. SolFS fornisce la crittografia integrata (ed è possibile aggiungere i propri meccanismi di crittografia) ed è in grado di contenere file di grandi dimensioni (diversi GB per file sono perfetti). Inoltre, SolFS ha anche una compressione integrata se ti interessa la dimensione del file.

0

Per ottimizzare la serializzazione, è possibile creare il proprio metodo di serializzazione, implementando l'interfaccia ISerializable e trasformandola in XML o JSon o qualsiasi altra cosa.

1

È necessario considerare seriamente la serializzazione. Sono andato avanti e indietro con questo (incluso provare SQLCE) alcuni mesi fa e non c'era nulla vicino alla velocità degli oggetti serializzati (nel mio caso stavo usando oggetti personalizzati) - SQLCE ha impiegato 2-3 volte il tempo per caricare come serializzato oggetti.

Se il footprint di memoria è troppo grande, è necessario riconsiderare il modo in cui si progetta ciò che si sta persistendo.

1

Si consiglia di utilizzare SQLite su SQLCE 4. Il motore SQLlite è progettato in modo esplicito per funzionare in ambienti con vincoli di memoria. La decisione della memoria rispetto alla velocità è lasciata allo sviluppatore.

Il open source ADO.NET library consente di sfruttare appieno gli strumenti del database Microsoft (DbProviderFactory, Entity Framework, Server Explorer, ecc.). Supporta anche la crittografia in modo nativo.

L'implementazione LRU sarebbe piuttosto semplice dato uno schema come il seguente:

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

Una combinazione di protobuf-net e File encryption in .NET può essere utile.

È possibile utilizzare protobuf-net per serializzare/deserialze rapidamente. (Vedi la guida introduttiva per un esempio di persistenza di un oggetto "Persona" in un file binario). protobuf ha anche metodi che restituiscono un byte [] in modo che tu possa passare questo alla crypto per evitare di leggere nuovamente il flusso di byte.

Problemi correlati