2010-06-22 15 views
8

Estoy escribiendo una aplicación que debe registrar información con bastante frecuencia, por ejemplo, dos veces en un segundo. Deseo guardar la información en una base de datos sqlite, sin embargo, no me importa realizar cambios en el disco una vez cada diez minutos.Sincronización de la base de datos sqlite de la memoria al archivo

Ejecutar mis consultas cuando uso una base de datos de archivos lleva demasiado tiempo y hace que la computadora se quede rezagada.

una solución opcional es el uso de una base de datos en memoria (se encaja, sin preocupaciones), y sincronizarlo con el disco de vez en cuando,

¿Es posible? ¿Existe alguna forma mejor de lograrlo? ¿Puede decirle a sqlite que se comprometa con el disco solo después de las consultas X?

¿Puedo resolver esto con Qt 's SQL envoltura?

Respuesta

11

Supongamos que tiene una base de datos en disco llamada 'disk_logs' con una tabla llamada 'events'. Se podría adjuntar una base de datos en memoria a su base de datos existente:

ATTACH DATABASE ':memory:' AS mem_logs; 

crear una tabla en la base de datos (que sería totalmente en memoria) para recibir los eventos del registro de entrada:

CREATE TABLE mem_logs.events(a, b, c); 

Entonces transferir los datos de la tabla en memoria a la mesa en el disco durante el tiempo de inactividad de la aplicación:

INSERT INTO disk_logs.events SELECT * FROM mem_logs.events; 

Y a continuación, elimine el contenido de la tabla en memoria existente. Repetir.

Esto es bastante complicado ... Si sus registros abarcan varias tablas y están vinculados con claves externas, puede ser difícil mantener estos sincronizados mientras copia de una tabla en memoria a una tabla en disco .

Antes de intentar algo (over-engineered incómodo) como este, también sugiero trying to make SQLite go as fast as possible. SQLite debería ser capaz de fácilmente> 50K inserciones de registro por segundo. Unas pocas entradas de registro dos veces por segundo no deberían causar una desaceleración significativa.

2

Una búsqueda breve de la documentación de SQLite no arrojó nada útil (no era probable y no me esperaba).

Por qué no utilizar una secuencia de fondo que se activa cada 10 minutos, copia todas las filas de registro de la base de datos en memoria en la base de datos externa (y las borra de la base de datos en memoria). Cuando su programa esté listo para finalizar, active el hilo de fondo una última vez para guardar los últimos registros, luego cierre todas las conexiones.

+0

Porque entonces necesito crear los registros, recordar qué parte del registro ya guardé, mantener el hilo de fondo y, en gran medida, implementar la sincronización. Eso es posible, pero quiero evitar eso. –

+0

Déjame saber cómo finalmente resolver esto. –

5

Si está ejecutando cada inserción dentro de su propia transacción, eso podría ser un importante contribuyente a las ralentizaciones que está viendo.Tal vez usted podría:

  • contar el número de registros insertados hasta ahora
  • comenzar una transacción
  • Inserte su registro
  • incrementa el contador de
  • Commit/transacción final, cuando N registros han sido insertados
  • Repita

El inconveniente es que si el sistema cr cenizas durante ese período te arriesgas a perder los registros no comprometidos (pero si estabas dispuesto a usar una base de datos en memoria, entonces parece que estás bien con ese riesgo).

Cuestiones relacionadas