2011-01-14 9 views
5

estoy mirando para agregar almacenamiento en caché para una aplicación de escritorio de Windows escrito en C# 4.caché local Biblioteca C# (persistente y cifrado)

Mis requisitos son para un persistente almacén de claves-valor que guarda en un archivo cifrado. Estoy tratando de almacenar en caché las llamadas remotas a un servidor que es potencialmente lento — y puede almacenar en caché una cantidad considerable de datos, es decir, más de 50 MB. Me gustaría poder establecer un valor máximo de tamaño de archivo con alguna forma de caducidad de LRU.

Pensé en serializar un diccionario, pero es probable que sea un poco lento inicializarlo, y tendrá una huella de memoria demasiado grande.

Estoy pensando que una base de datos cifrada SQLCE 4 podría ser la mejor solución, pero parece pesada cuando realmente solo quiero una tabla hash única. Tampoco ofrece de forma nativa las características del tipo de caché de caducidad, etc.

¿Alguien puede sugerir algo más que valga la pena considerar, o alguna sugerencia sobre cómo optimizar la serialización/deserialización?

+0

¿Ha experimentado con la serialización del diccionario? En mi experiencia, la deserialización de archivos suele ser muy rápida. –

+0

No lo he hecho - la sobrecarga de memoria de un diccionario de 50MB + es mi preocupación antes de perf – Chris

+0

Pago y envío: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) class –

Respuesta

0

Le invitamos a mirar nuestra biblioteca SolFS. Este es un sistema de archivos virtual, donde coloca sus datos en archivos y usa la clave como nombre de archivo. Sin embargo, debe realizarse una limpieza de archivos "vencida" en su código. SolFS proporciona cifrado incorporado (y puede agregar sus propios mecanismos de cifrado) y es capaz de almacenar archivos de gran tamaño (varios GB por archivo están perfectamente bien). Además, SolFS también tiene compresión incorporada si te preocupa el tamaño del archivo.

0

Para optimizar la serialización, puede hacer su propio método de serialización, implementando la interfaz ISerializable y convirtiéndola en XML o JSon o lo que sea.

1

Debería considerar seriamente la serialización. Estuve dando vueltas con esto (incluyendo el intento de SQLCE) hace unos meses y no había nada parecido a la velocidad de los objetos serializados (en mi caso yo estaba usando objetos personalizados) - SQLCE tardó 2-3 veces más en cargarse como serializado objetos.

Si la huella de memoria es demasiado grande, entonces debe reconsiderar cómo está diseñando lo que está persistiendo.

1

Aconsejaría usar SQLite sobre SQLCE 4. El motor SQLlite está explícitamente diseñado para funcionar en entornos con limitaciones de memoria. La decisión de la memoria frente a la velocidad se deja al desarrollador.

El open source ADO.NET library le permite aprovechar al máximo las herramientas de base de datos de Microsoft (DbProviderFactory, Entity Framework, Server Explorer, etc.). También es compatible nativamente con el cifrado.

La implementación LRU sería bastante sencillo dado un esquema como el siguiente:

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 combinación de protobuf-net y File encryption in .NET puede ser útil.

Puede usar protobuf-net para serializar/deserializar rápidamente. (Consulte la guía de introducción para ver un ejemplo de persistencia de un objeto 'Persona' en un archivo binario). protobuf también tiene métodos que devuelven un byte [] por lo que puede pasar esto a la criptografía para evitar volver a leer la secuencia de bytes.