Ist SQLite eine sinnvolle Option für die Datenprotokollierung?

8

Ich versuche, eine kleine Datenprotokollierungsanwendung unter Linux einzurichten. Die Daten kommen über die serielle Schnittstelle an und sollten von dort zur Protokollierung und zur grafischen Anzeige gepumpt werden.

Die Protokollierungsfunktion dient zu Initialisierungszwecken der Grafikfunktion nach einem Neustart.

Die Daten kommen jede Sekunde an und bestehen aus 1 5-Dezimalstellen-Genauigkeit. Sie sollten 2 Jahre lang protokolliert werden. Mein aktueller freier Speicherplatz beträgt ca. 15 GB.

Die Sprachen des Projekts sind bisher Bash und Python.

Mein Ziel ist es, ein einfaches, aber robustes Protokollierungssystem (möglicherweise einige Live-Backups auf einem Flash-Laufwerk?) Zu erstellen, das auch schnell und einfach aus Python zu lesen und aus Bash zu schreiben ist.

Ist SQLite dafür geeignet (ich habe es noch nie benutzt)? Ist eine Textdatei in meinem Home- Verzeichnis dafür geeignet?

Vorac
quelle
7
In der Software-Welt gibt es nicht "die Besten"; Es gibt nur Kompromisse.
m3th0dman
@Thijs van Dien, dieser Kommentar sollte eine Antwort sein - er verdient zumindest eine positive Bewertung für seine Einfachheit, wenn nicht die akzeptierte Antwort!
Vorac
Wie du möchtest. :)
Thijs van Dien

Antworten:

6

Beide Optionen scheinen mir gültig zu sein. In solchen Fällen ist es eine nützliche Regel, die einfachste Sache zu tun, die möglicherweise funktionieren könnte . Textdateien sind einfacher zu handhaben und es wird erwartet, dass sie zumindest am Anfang einigermaßen gut funktionieren. Sobald Anforderungen auftreten, die mithilfe einer Datenbank besser erfüllt werden, ist es trivial, sie zu importieren. Mit dieser Strategie verschieben Sie Entwurfsentscheidungen so lange wie möglich (jedoch nicht länger). Als solches erledigen Sie keine unnötige Arbeit. Wann immer es benötigt wird, haben Sie ein viel besseres Verständnis dafür, was genau Sie brauchen. Daher ist es wahrscheinlicher, dass Sie das Richtige bauen und keine Zeit damit verschwenden, das Falsche zu bauen.

Thijs van Dien
quelle
Sehr guter Rat. Ich schätze, ich spreche aus Erfahrung. Irgendwie auch nach Hause gekommen.
TheRealChx101
11

Ich würde sagen, dass angesichts der Anforderungen an Robustheit und Langlebigkeit eine einfache alte Textdatei die bessere Wahl ist. Wie andere angemerkt haben, ist Ihre Datenrate nicht hoch. Außerdem ist Ihre Nachbearbeitung vom Protokollierungssystem aus vollständig offline, sodass Sie Ihre Daten nicht auf die effizienteste Weise schreiben müssen, da Sie sie nach Belieben zurücklesen können.

Ein Dateisystem ist eine Datenbank (obwohl eine entartete), und das Anhängen an Textdateien schont die Systemressourcen. Es wäre schwer zu schlagen

echo data >> mylogfile

für minimale Systemaufrufaktivität. Außerdem sind Textdateien angesichts interner Beschädigungen viel robuster als eine SQLite-Datenbank und insbesondere eine Pickle-Datei.

Ich vermute, dass Ihre Anwendung ein entfernter, unbeaufsichtigter Sensor ist, an den ein Bediener nicht leicht gelangen kann. In diesem Fall sollte die Lösung mit der niedrigsten Technologie bevorzugt werden.

msw
quelle
Das andere schöne an der Verwendung einer einfachen Textdatei ist, dass Sie, wenn Sie sie nach Tag aufteilen, mit derselben Technik alte Dateien mithilfe eines cronJobs komprimieren können, wodurch Speicherplatz gespart wird. So
Peter K.
Ja, Textdatei mit einer Zeile pro Sekunde. Einfach, langlebig und erweiterbar (wenn ich mehr Sensoren / Mengen hinzufüge, werden diese nur an dieselbe Zeile angehängt). Hier ist eine allgemeinere Diskussion meines Systems und hier ist der Quellcode in Arbeit. Ich werde eine Antwort mit Screenshots in dieser anderen Antwort veröffentlichen, wenn dies funktioniert.
Vorac
Wichtig ist, dass eine Textdatei mit chattr + a für den Nur-Anhängen-Modus markiert werden kann, um den Inhalt effektiv vor dem Überschreiben zu schützen. Mit SQLite geht das nicht.
Federico
3

Wie @gbjbaanb betonte, ist SQLite "nicht dafür ausgelegt, sehr viele Datensätze mit hoher Geschwindigkeit einzufügen".

Ich würde sagen, 1 Nummer / 1 Sekunde ist keine hohe Geschwindigkeit, wenn Sie die Verbindung zur Datenbank offen halten. Und das sollte einigermaßen gut funktionieren, aber Protokolle werden normalerweise für Dateien erstellt. Diese Lösung ist konventioneller und daher möglicherweise eleganter.

Ich würde Textdateien verwenden und jeden Monat eine neue erstellen. Sie können alte Dateien nach einiger Zeit komprimieren und / oder löschen, die für Sie geeignet sind, wenn der Festplattenspeicher ein Problem darstellt.

Wenn "Die Protokollierungsfunktion dient zu Initialisierungszwecken der Grafikfunktion nach einem Neustart." und Sie brauchen nur ein Zeitfenster mit den letzten n Elementen dann können Sie einen hinzufügen finallyBlock , um Ihren Code und die Verwendung picklezu dumpeinigen Datenstrukturen und loadsie nach dem Neustart. Stellen Sie jedoch sicher, dass Sie beim Neustart tatsächlich das tun können, was Sie benötigen.

Dies ist wahrscheinlich die Lösung, die weniger Ressourcen benötigt und Ihren Anforderungen besser entspricht.

Trylks
quelle
Ich habe Ihre Antwort sehr gründlich geprüft. Ich kam jedoch zu dem Schluss, dass das monatliche Erstellen einer neuen Datei dem Projekt eine bedeutende Logik hinzufügt. Aus diesem Grund habe ich mich für eine Hudge-Datei entschieden. Es wird jedoch einmal im Monat archiviert, wofür ich Ihnen +1 gebe.
Vorac
2

Nein. SQLite ist ein großartiges Tool, aber es ist nicht dafür ausgelegt, sehr viele Datensätze mit hoher Geschwindigkeit einzufügen.

Die beste Lösung hier ist etwas, an das schnell angehängt werden kann, und das ist eine Datei. Eine solche Datei kann sich an einem beliebigen Ort befinden. Unter Linux werden sie normalerweise in / var / log abgelegt (da einige Administratoren es vorziehen, / var auf einer separaten Partition abzulegen. Wenn eine betrügerische App viele Daten schreibt, stürzt sie nicht ab das Betriebssystem, wenn es die Festplatte füllt).

Sobald die Daten geschrieben sind, können Sie ein Tool schreiben, das die Protokolldateien liest, sie in eine SQLite-Datenbank importiert und für die Berichterstellung verwendet.

Alternativ können Sie ein vorhandenes Tool wie Nagios verwenden . Schreiben Sie ein Plugin dafür (wenn Sie es nicht so konfigurieren können, dass Ihre Daten direkt in der Protokolldatei erkannt werden) und verwenden Sie es für die Überwachung und Berichterstellung.

gbjbaanb
quelle
Sie würden sagen, dass ein Datensatz pro Sekunde "hohe Geschwindigkeit" ist?
Thorsten Müller
Nein, nicht wirklich, aber SQLite ist immer noch nicht das Werkzeug dafür. Das Einfügen in die Mitte einer Tabelle mit 63 Millionen Datensätzen wird nicht sehr schnell gehen. Eine Textdatei ist immer noch eine effizientere Option.
Gbjbaanb
0

Ja. SQLite ist nur eine Binärdatei. Sie müssen nur einmal ein leeres Skelett für Ihre Datenbank haben, dann können Sie einfach Daten an diese Binärdatei anhängen, um die "Datenbank" zu füllen.

In einer früheren Firma haben wir dies für das Symbian-Betriebssystem (unter Verwendung der c ++ - Sprache) implementiert und auch eine Art Protokollierung durchgeführt. Leider ist das eine Weile her und ich kann mich nicht an die Details erinnern.

Marcel
quelle