2009-01-03 27 views
11

Estoy buscando una solución para almacenar en caché grandes cantidades de datos.Diccionario/memoria caché con respaldo de disco para C#

preguntas relacionadas pero para diferentes idiomas:

Cerrar cuestión en términos diferentes:

No necesito (ni deseo pagar nada por) persistencia, transacciones, seguridad de subprocesos o similares y quiero algo que no sea mucho más complejo de usar que una Lista <> o un Diccionario <>.

Si tengo que escribir el código, sólo voy a guardar todo lo que fuera como archivos en el directorio temporal:

string Get(int i) 
{ 
    File.ReadAllText(Path.Combine(root,i.ToString()); 
} 

En mis casos en el índice será un int (y que debería ser consecutivos o lo suficientemente cerca) y los datos serán string, así que puedo salirse con la suya tratando un POD y preferiría ir ultra ligero y hacer exactamente eso.

El uso es que tengo una secuencia de 3k archivos (como en el archivo n. ° 1 al n. ° 3000) totalizando 650 MB y necesito hacer un diff para cada paso de la secuencia. Espero que sea igual o un poco más y no quiero tener todo eso en la memoria (pueden aparecer casos más grandes en los que no puedo).


Varias personas me han sugerido soluciones diferentes para mi problema. Sin embargo, ninguno parece estar dirigido a mi pequeño nicho. Las razones por las que busco el almacenamiento en caché respaldado por disco es porque estoy esperando que mi uso actual use hasta 1/3 a 1/2 de mi espacio de direcciones disponible. Me preocupa que los casos más grandes se quedarán sin espacio. No estoy preocupado por pisar, la persistencia o la replicación. Lo que estoy buscando es una solución mínima que use un mínimo de código, una mínima huella de uso, una mínima sobrecarga de memoria y una complejidad mínima.

Estoy empezando a pensar que soy demasiado optimista.

+0

¿Por qué no el sistema de archivos? Eso es lo que está diseñado para ... – RedFilter

+0

Lo haré si alguien no puede señalarme algo mejor que ya está escrito. – BCS

+0

¿No es cierto que un caché basado en disco derrota el propósito completo de un mecanismo de almacenamiento en caché? –

Respuesta

0

intente buscar en NCache here también.

No estoy afiliado a esta empresa. Acabo de descargar y probar su versión express gratuita.

2

Renuncia - Estoy a punto de que apunte a un producto que estoy involucrado en

Todavía estoy trabajando en el lado sitio web de las cosas, por lo que no es una gran cantidad de información, pero Serial Killer haría. ser un buen ajuste para esto Tengo ejemplos que usan la serialización .Net (puede proporcionar ejemplos), por lo que escribir un caché de mapa persistente para objetos serializables .Net sería trivial.

Auto promoción descarada suficiente - si está interesado, utilice el enlace de contacto en el sitio web.

+0

+1 para cosas relacionadas pero estoy buscando más soluciones ultraligeras (ideal sería donde clave y valores son ambos POD y se almacenan como datos binarios bloques) – BCS

+0

SerialKiller es bastante ligero - ¡Odio que lo descartes por ese motivo! La interfaz es básicamente una asignación de una clave (generada por el sistema) a una secuencia binaria. –

+0

La versión ingenua, probablemente defectuosa y ampliable de lo que estoy buscando (omitiendo las políticas de desalojo) podría hacerse en aproximadamente 30 LOC. Me sorprendería si pudieras obtener incluso la mitad de tu lista de características antes de eso. – BCS

4

Lo que realmente quieres es un B-Tree. Esa es la estructura de datos principal que utiliza una base de datos. Está diseñado para permitirle intercambiar de manera eficiente porciones de una estructura de datos desde y hacia el disco, según sea necesario.

No conozco ninguna de las implementaciones B-Tree independientes de alta calidad y ampliamente utilizadas para C#.

Sin embargo, una forma fácil de obtener una sería utilizar una base de datos Sql Compact. El motor Sql Compact se ejecutará en el proceso, por lo que no necesita un servicio independiente en ejecución. Te dará un b-tree, pero sin todos los dolores de cabeza. Puedes usar SQL para acceder a los datos.

+0

No me gusta la sobrecarga. Vea mis ediciones, pero podría salirme con una única actualización en la matriz de memoria y un solo disco leído por carga para que B-Tree sea excesivo ... en mi caso. – BCS

+0

Una ventaja del uso de la base de datos in-proc es que le brinda independencia de la ruta de acceso. Cuando necesite cambiar los datos que almacena o las claves que necesita para acceder a ellos, no necesita volver a escribir una gran parte de su aplicación. –

+0

Sin embargo, si realmente siente que las cosas que necesita hacer con la información es así de simple, entonces pensaría que podrías usar algo desde cero que usara Dictionary (of int, string), donde la cadena era un nombre de archivo, en unas 2-3 horas de trabajo ... –

0

He introducido parcialmente la aplicación EhCache Java en .NET. El almacenamiento en caché distribuido aún no está implementado, pero en un solo nodo, todas las UnitTests originales pasan. OpenSource completo:

http://sourceforge.net/projects/thecache/

que puede crear una gota binaria si lo necesita (sólo código fuente es liviano ahora)

+0

parece una buena proyecto. OTOH parece excesivo para mí. – BCS

0

me gustaría tomar la ruta DB incorporado (SQLite, Firebird), pero aquí están algunas otras opciones:

0

Recomiendo el bloque Caching Application en la biblioteca Enterprise de MS. También se recomendó eso, pero el enlace apunta a un artículo sobre la porción de acceso a datos de la biblioteca Enterprise.

Aquí está el enlace a la aplicación del bloque de almacenamiento en caché:

http://msdn.microsoft.com/en-us/library/cc309502.aspx

Y específicamente, tendrá que crear un nuevo almacén de respaldo (si es que persiste en el disco no está ahí):

http://msdn.microsoft.com/en-us/library/cc309121.aspx

0

Teniendo en cuenta sus ediciones recientes de la pregunta, le sugiero que implemente la solución que se menciona en su pregunta, ya que es muy poco probable que encuentre una solución tan ingenua envuelta en una biblioteca para que puedas reutilizar.

+0

Buena oportunidad lo haré. Si lo hago, publicaré el código. – BCS

2

Esto es muy similar a mi pregunta

Looking for a simple standalone persistant dictionary implementation in C#

No creo que una biblioteca que se ajuste exactamente lo que quiere existe, tal vez es hora de un nuevo proyecto en GitHub.

+0

Enlace agregado. ¿Qué tal si agregas un enlace al otro lado? – BCS

+0

OTOH la motivación es diferente. estabas buscando persistencia, quiero almacenar cosas en el disco en lugar de guardarlas en la memoria. Gran superposición, pero no es lo mismo. – BCS

+0

Sin preocupaciones, agregué un enlace de mi publicación –

Cuestiones relacionadas