cref - Disco/caché respaldado en disco para c#
remarks c# (10)
Estoy buscando una solución para el almacenamiento en caché de grandes cantidades de datos.
preguntas relacionadas pero para diferentes idiomas:
Pregunta cercana en diferentes términos:
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, simplemente guardaré todo como archivos en el directorio temporal:
string Get(int i)
{
File.ReadAllText(Path.Combine(root,i.ToString());
}
En mis casos, en índice será un int
(y deben ser consecutivos o lo suficientemente cerca) y los datos serán una string
para que pueda salirse con la suya tratando un POD y prefiera ir ultra ligero y hacer exactamente eso.
El uso es que tengo una secuencia de archivos 3k (como en el archivo n. ° 1 al n. ° 3000) que asciende a 650 MB y necesito hacer una diferencia 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 han sugerido diferentes soluciones 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 utiliza 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.
Dadas 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 ingenua en una biblioteca para que pueda volver a utilizarla.
Descargo de responsabilidad: estoy a punto de señalarle un producto en el que participo.
Todavía estoy trabajando en el lado del sitio web, así que no hay mucha información, pero Serial Killer sería una buena opción 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.
Basta de auto promoción sin vergüenza: si está interesado, use el enlace de contacto en el sitio web.
He insertado parcialmente la aplicación EhCache Java en .NET. El almacenamiento en caché distribuido aún no está implementado, pero en un solo nodo, todos los UnitTests originales pasan. Full OpenSource:
http://sourceforge.net/projects/thecache/
Puedo crear un salto binario si lo necesita (solo el código fuente está disponible ahora)
Intenta mirar NCache aquí también.
No estoy afiliado a esta compañía. Acabo de descargar y probar su versión express gratuita.
Lo que realmente quieres es un B-Tree. Esa es la estructura de datos primaria 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 implementación de B-Tree independiente y de alta calidad ampliamente utilizada para C #.
Sin embargo, una manera fácil de obtener uno sería usar 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.
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 al Bloque de aplicación de almacenamiento en caché:
http://msdn.microsoft.com/en-us/library/cc309502.aspx
Y específicamente, querrá crear una nueva tienda de respaldo (si una que persiste en el disco no está allí):
Tomaría la ruta DB incorporada (SQLite, Firebird), pero aquí hay algunas otras opciones:
- Berkeley DB : no es la base de datos SQL incrustada, pero parece ser la elección correcta para este tipo de tareas, aunque no se puede utilizar fácilmente desde .net
- db4o : un OODB, interfaz muy simple
puede usar el bloque de aplicación MS con una solución de caché basada en disco
Aquí hay una implementación de B-Tree para .net: http://bplusdotnet.sourceforge.net/
Esto es muy similar a mi pregunta
Buscando una implementación de diccionario persistente independiente simple en C #
No creo que exista una biblioteca que encaje exactamente con lo que quieres, tal vez sea hora de un nuevo proyecto en github.