¿SQLite es una opción sensata para el registro de datos?

8

Estoy tratando de configurar una pequeña aplicación de registro de datos en Linux. Los datos llegan a través del puerto serie, y desde allí se deben bombear al registro y a la pantalla gráfica.

La funcionalidad de registro está allí para fines de inicialización de la funcionalidad de gráficos, después de un reinicio.

Los datos llegan cada segundo y se componen de 1 número de precisión de 5 dígitos decimales, y deben registrarse durante 2 años. Mi espacio libre actual es de unos 15 GB.

Los lenguajes del proyecto hasta ahora son bash y python.

Mis objetivos son hacer un sistema de registro simple pero robusto (¿tal vez algunas copias de seguridad en vivo en una unidad flash?), Que también es rápido y fácil de leer desde python y escribir desde bash.

¿SQLite es adecuado para esto (nunca lo he usado)? Es un archivo de texto en mi casa directorio adecuado para esto?

Vorac
fuente
77
En el mundo del software no hay "el mejor"; solo hay compensaciones.
m3th0dman
@Thijs van Dien, este comentario debería ser una respuesta: merece al menos un voto positivo por su simplicidad, ¡si no es la respuesta aceptada!
Vorac
Como desées. :)
Thijs van Dien

Respuestas:

6

Ambas opciones me parecen válidas. En tales casos, una regla útil para aplicar es hacer lo más simple que posiblemente pueda funcionar . Los archivos de texto son más fáciles de comenzar y se espera que funcionen razonablemente bien al menos al principio. Una vez que surgen requisitos que se satisfacen mejor utilizando una base de datos, será trivial importarlos. Con esta estrategia, pospone las decisiones de diseño el mayor tiempo posible (pero no más que eso). Como tal, no haces trabajo innecesario. Cuando, si alguna vez, será necesario, tendrá una mejor comprensión de qué es exactamente lo que necesita. Por lo tanto, es más probable que construyas lo correcto y no pierdas tiempo construyendo lo incorrecto.

Thijs van Dien
fuente
Muy buen consejo. Hablando por experiencia, supongo. Una especie de golpe a casa también.
TheRealChx101
11

Diría que, dados los requisitos de robustez y longevidad, un archivo de texto antiguo es una mejor opción. Como otros han notado, su velocidad de datos no es alta; Además, su procesamiento posterior está fuera de línea desde el sistema de registro, por lo que no necesita escribir sus datos de la manera más eficiente porque puede volver a leerlos cuando lo desee.

Un sistema de archivos es una base de datos (aunque degenerada), y los archivos de texto son muy ligeros en cuanto a recursos del sistema. Sería difícil de superar

echo data >> mylogfile

para una actividad mínima de llamadas al sistema. Además, los archivos de texto son mucho más robustos frente a la corrupción interna que una base de datos sqlite y especialmente un archivo pickle.

Supongo que su aplicación es un sensor remoto y desatendido, en un lugar no fácil de conseguir para un operador. En ese caso, se debe preferir la solución de menor tecnología.

msw
fuente
La otra cosa buena de usar un archivo de texto simple es que, si lo divide por día, puede usar la misma técnica para comprimir archivos viejos usando un crontrabajo, ahorrando espacio en disco. Me gusta esto
Peter K.
Sí, archivo de texto con una línea por segundo. Simple, duradero y expandible (si / cuando agrego más sensores / cantidades, simplemente se agregarán en la misma línea). Aquí hay una discusión más general de mi sistema y aquí está el código fuente en funcionamiento. Publicaré una respuesta con capturas de pantalla en esa otra respuesta, cuando sea funcional.
Vorac
Es importante destacar que un archivo de texto se puede marcar para el modo de solo agregar usando chattr + a protegiendo efectivamente el contenido de la sobrescritura. Eso no se puede hacer con sqlite.
Federico
3

Como señaló @gbjbaanb, SQLite "no está diseñado para insertar muchos registros a alta velocidad".

Yo diría que 1 número / 1 segundo no es de alta velocidad si mantiene abierta la conexión a la base de datos. Y eso debería funcionar razonablemente bien, pero los registros generalmente se realizan en archivos, esa solución es más convencional y quizás elegante debido a eso.

Usaría archivos de texto y crearía uno nuevo cada mes. Puede comprimir y / o eliminar archivos antiguos después de un tiempo que le convenga si el espacio en el disco duro es un problema.

Si "La funcionalidad de registro está allí para fines de inicialización de la funcionalidad de gráficos, después de un reinicio". y solo necesita una ventana de tiempo con los últimos n elementos, luego puede agregar un finallybloque a su código y usarlo pickleen dumpalgunas estructuras de datos y loadluego de reiniciar. Pero asegúrese antes de que el reinicio le permita hacer lo que necesita.

Esa es probablemente la solución que requiere menos recursos y se ajusta más a sus requisitos.

Trylks
fuente
Considere tu respuesta muy profundamente. Sin embargo, llegué a la conclusión de que crear un nuevo archivo cada mes agrega una lógica significativa al proyecto. En consecuencia, he decidido usar un archivo hudge. Sin embargo, se archivará una vez al mes, por lo que le doy +1.
Vorac
2

No. SQLite es una gran herramienta, pero no está diseñada para insertar muchos registros a alta velocidad.

La mejor solución aquí es algo que se puede agregar rápidamente, y ese es un archivo. Tal archivo se puede ubicar en cualquier lugar que desee, en Linux generalmente se colocan en / var / log (ya que algunos administradores prefieren colocar / var en una partición separada, por lo que si una aplicación no autorizada escribe muchos datos, no se bloqueará el sistema operativo cuando llena el disco).

Una vez que se escriben los datos, puede escribir una herramienta que lea los archivos de registro, los importe en una base de datos SQLite y los use para generar informes.

Alternativamente, use una herramienta existente como Nagios . Escriba un complemento para él (si no puede configurarlo para reconocer sus datos directamente en el archivo de registro) y úselo para monitorear e informar.

gbjbaanb
fuente
¿Diría que un registro por segundo es "alta velocidad"?
thorsten müller
no, en realidad no, pero SQLite todavía no es la herramienta para esto. Insertar en el medio de una tabla con 63 millones de registros no será súper rápido. Un archivo de texto sigue siendo una opción más eficiente.
gbjbaanb
0

Si. SQLite es solo un archivo binario. Solo necesita tener un esqueleto vacío para su base de datos una vez, luego puede agregar datos a ese archivo binario para llenar la "base de datos".

En una empresa anterior, hemos implementado esto para el sistema operativo Symbian (usando el lenguaje c ++), haciendo algún tipo de registro también. Lamentablemente esto fue hace un tiempo y no puedo recordar los detalles.

Marcel
fuente