2008-10-03 11 views
9

Cuáles son algunas de las técnicas populares que puede adoptar para agregar durabilidad a sus estructuras de datos en memoria (es decir) si el proceso falla, puede conservar todas las operaciones previamente ejecutadas en esos datos ¿estructura?Agregando durabilidad a estructuras de datos en memoria

Si mi estructura de datos implica solo una lista de tuplas, entonces solo las almacenaría en una base de datos SQL y eso me daría durabilidad de forma gratuita. Pero, ¿y si mi estructura de datos fuera un gráfico o un árbol?

Lo único que se me ocurre es registrar explícitamente todas las operaciones en el disco (solo anexar registro) y, en caso de falla, reproducir el registro para conservar el estado anterior. Si el registro se vuelve demasiado grande, habrá un paso de compactación. Supongo que esto es lo que hace internamente un motor de base de datos para la durabilidad (¿cómo se llama este proceso)?

Nota: este no es un escenario donde todo el conjunto de datos no cabe en la memoria.

Respuesta

0

La palabra que está buscando es "serialización".

+0

Obviamente he oído hablar de la palabra "serialización". Y obviamente la serialización ingenua de toda la estructura de datos en el disco después de cada operación funcionará en teoría, pero no en la práctica. Estaba hablando de hacer esto de manera eficiente (si no, ¿de qué sirve tener los datos en la memoria?) – Harish

+0

¡Ah! Tal vez algún mecanismo de almacenamiento en caché le vendría mejor entonces? – Rik

0

Puede encontrar alguna manera de serializar su estructura, ya sea con XML, YAML, JSON, etc. Luego, puede almacenar eso en la base de datos, o quizás poner un gran try/catch alrededor del punto de ejecución principal para el programa. Entonces, si ocurre alguna excepción no detectada, que causará la falla del programa, podría serializar sus datos, así como registrar cualquier mensaje de error, seguimientos de pila, etc.

0

Sí, desea serializar los datos a algún formato - xml, binario, lo que sea. Dependiendo del lenguaje de programación, esto puede ser incorporado para usted. Java tiene ObjectStreams, .NET tiene XmlSerializer y también BinaryFormatter.

0

Cualquier respuesta a su pregunta implicará hacer algo así como lo que hace un sistema de base de datos ACID. Así que diría que lo mejor es usar un RDBMS para almacenar el estado de su aplicación, actualizando cada vez que tenga una transacción (de solicitud) que no debe perderse.

4

Es posible que desee probar un object prevalence engine. Para .NET, es posible que desee probar Bamboo.Prevalence, que es un puerto de un motor similar llamado Prevayler para Java.

+0

Prevalencia de objetos Los motores parecen funcionar igual que la forma en que sugerí: cambios diarios para la recuperación del sistema. De todos modos, gracias por esos enlaces. ¡Parecen interesantes! – Harish

+0

Justice, ¿usaste Prevayler? ¿Podrías responder mi pregunta al respecto? http://stackoverflow.com/questions/454294/what-are-synchronizing-strategies-for-prevayler – Sergey

+1

En mi experiencia, la prevalencia funciona muy bien para conjuntos de datos pequeños y de escritura intensiva.Funciona menos bien con los desarrolladores que no entienden intuitivamente las restricciones exigidas a los objetos prevalentes, en particular, el determinismo frente a la computación desplazada en el tiempo o en el espacio. –

1

Implementé la tecnología "Mrjb" en productos de 2 compañías, que es básicamente lo que sugirió en su pregunta: una base de datos "Memory Resident Journal Backed", una estructura de datos en memoria donde cada el cambio se registra en el disco a medida que sucede. ¡Y funciona genial para nosotros!

http://www.edval.biz/memory-resident-programming-object-databases

que estaría feliz de compartir nuestras experiencias del mundo real con el uso de esto en un contexto de producción. Me encanta poder reproducir una secuencia exacta de eventos o retroceder a cualquier punto en el tiempo.

Cuestiones relacionadas