Datei an Offsets anpassen
-
Hallo zusammen
ich schreibe eine Art Recovery-File, sprich ich schreibe Datensätze der Applikation runter, um im Falle eines Restarts diese Daten initial laden zu können und mit einem Datenstand direkt starten zu können.
Je nach Anwendungsfall habe ich bis zu 2 Mio unterschiedliche Datensätze, die in diesem Recovery-File enthalten sind.Nun überlege ich, ob es Sinn macht, nur die Datensätze, die sich geändert haben an ihren jeweiligen Offsets gezielt in die Datei zu schreiben.
Wenn ich einmal pro Minute die Datei schreibe, hätte ich ca. 30% der Datensätze, die sich geändert haben in Relation zur Gesamtmenge.Die Datensätze sind zwar prinzipiell unterschiedlich lang und auch variabel, ich könnte aber einfach eine Maximalgröße pro Datensatz festlegen, in die jeder Datensatz reinpasst. Der Overhead wäre da nicht groß und Speicherplatz ist auch nicht das Problem.
Würde es aus eurer Sicht Sinn machen, gezielt an Offsets die geänderten Datensätze zu schreiben, oder lieber jedes Mal die ganze Datei zu schreiben?
gruß Tobi
-
Wie groß ist denn so ein Datensatz im Durchschnitt? Käme statt einer Textdatei auch was anderes infrage? Konkret will ich auf SQLite3 hinaus.
-
Prinzipiell bin ich offen in der Wahl der Mittel. Eine brauchbare C++-API wäre natürlich immer gut.
Evtl. wäre aber zu Recherche- und Debug-Zwecken ein lesbares File von Vorteil.Die Datensätze sind ca. 300 Byte groß.
-
Wenn der Datensatz aus Klartext besteht kannste den über ein geeignetes Tool (zB. SQLiteStudio) direkt einsehen. Dazu muss das Tool aber ggf. installiert oder als Portable zur Verfügung stehen.
SQLite3 ist ziemlich schlank, schnell und lässt sich gut in C++ Programme integrieren. Der Memory Footprint sind ca. 600K und die komplette DB wird in einer Datei abgelegt. Damit haste den Vorteil, dass du einzelne Datensätze gezielt verändern kannst, ohne dich in der Größe einzuschränken bzw. Annahmen über die Größe machen zu müssen.
Wenn du dem Datensatz noch ein paar Attribute mitgeben kannst ist die Suche nach relevanten Datensätzen vllt sogar noch komfortabler.
-
@It0101 sagte in Datei an Offsets anpassen:
Würde es aus eurer Sicht Sinn machen, gezielt an Offsets die geänderten Datensätze zu schreiben, oder lieber jedes Mal die ganze Datei zu schreiben?
Bei 30% geänderter kleiner bis mittelgrosser Datensätze ist es so-gut-wie sicher effizienter das ganze File neu zu schreiben.
-
Sicherheitshalber (gerade bei einer Art Recovery-File) solltest du vor dem Neuschreiben am besten eine Backup-Datei davon machen (bei ca. 600MB willst du die Daten ja sicherlich nicht verlieren).
Die Frage ist aber, wie lange dauert der gesamte Kopier- und Schreibprozess, denn dadurch verlierst du ja an Gesamtperformance des Programms (bes. falls noch andere IO-Operationen getätigt werden)?
Oder ist das Programm sowieso die meiste Zeit im Idle-Zustand?
-
@Th69 sagte in Datei an Offsets anpassen:
Sicherheitshalber (gerade bei einer Art Recovery-File) solltest du vor dem Neuschreiben am besten eine Backup-Datei davon machen (bei ca. 600MB willst du die Daten ja sicherlich nicht verlieren).
Die Frage ist aber, wie lange dauert der gesamte Kopier- und Schreibprozess, denn dadurch verlierst du ja an Gesamtperformance des Programms (bes. falls noch andere IO-Operationen getätigt werden)?
Oder ist das Programm sowieso die meiste Zeit im Idle-Zustand?Der File-Schreiber hat einen eigenen Thread und liest eine Queue aus und schreibt dann auch nicht alles sofort runter sondern sammelt erstmal Updates.
-
This post is deleted!
-
@It0101
Wäre vermutlich trotzdem gut nicht direkt in das File zu schreiben sondern ein 2. File zu erzeugen, und wenn das fertig geschrieben ist das alte Recovery-File durch das neue zu ersetzen. Die meisten File-Systeme können "atomic rename" - dadurch solltest du dann immer ein konsistentes Recovery-File haben, egal wo/wie der Prozess unterbrochen wurde.