Endlos Datei?
-
Hallo,
bin im moment dabei eine Event Logging Funktion zuschreiben! Dabei werden Event in einem best. Intervall als Datensätze (Zeilen) in eine Log- datei (CSV. Format) gespeichert. Jeder Datensatz besteht noch einen Zeitstempel + Daten. Es werden täglich ungefähr 10 Datensätze (50Byte) in die datei geschrieben/angehängt!
Nun soll die Datei den inhalt aller Events des letzen Jahres enthalten, d.h. datensätze, die älter als ein jahr sind, sollen gelöscht werden.Ein Jahr enthält 365 Tage x 10 Datensätze x 50 Bytes ca. 200000byte 200Kbyte (nicht sonderlich viel daten)
so nun das Problem:
Wenn ich nun die datensätze die älter als ein jahr sind löschen will, muss ich ja ne neue Datei erstellen, und die Datensätze da rein kopieren die Nicht älter als ein Jahr sind. Danach die Alte datei löschen und die neue unbennen.
Aber dies ist ja rel. umständlich und zeitkritisch, wenn ich das intervall erhöhe so das es vll. 1000 Datensätze pro tag wären und ich alle Daten innerhalb 10 jahre speichern will..
gibt es eine andere Möglichkeit.. um umkopieren zu vermeiden?
-
Wenn alle Datensaetze gleich gross sind kannst du einfach wieder anfangen die Datei von vorne beginnend zu ueberschreiben. Rotierend, sozusagen. Die Datensaetze brauchen dann natuerlich Zeitstempel.
Bei 200KB wuerde ich mir aber wirklich nicht den Umstand machen. Ich wuerde einfach alle Datensaetze im RAM halten und in regelmaessigen Intervallen alles zusammen auf die Platte schreiben. Das geht auch noch, wenn es ein paar Megabyte sind.
-
Das mit dem im RAM halten geht leider net:) Ich verwende C, weil dies eine scriptsprache von WinCC (SPS Visaualisierung) ist! d.h. ich kann eine funktion schreiben, welche nach einem best SPS bit Event gestartet wird!
Ich muss die Datei so jedes mal öffnen ,beschreiebn und wieder schliessen!
Wie siehts aus, wenn ich von mehren Event gleichzeitig in die Datei schreiben will? Wartet dann "fprintf", bist der andere Process (Event) mit fprintf fertig ist?
Wie kann ich anfangen wieder von vorne reinzuschreiben? kann doch nur daten anhängen nicht überschreiben?
-
BorisDieKlinge schrieb:
Wie siehts aus, wenn ich von mehren Event gleichzeitig in die Datei schreiben will? Wartet dann "fprintf", bist der andere Process (Event) mit fprintf fertig ist?
fprintf wartet soweit ich weiss nicht, bis der andere Prozess mit seinem fprintf fertig ist. Du musst also selbst synchronisieren, wie man es eben von Multithreading-Umgebungen kennt.
BorisDieKlinge schrieb:
Wie kann ich anfangen wieder von vorne reinzuschreiben? kann doch nur daten anhängen nicht überschreiben?
Du oeffnest die Datei ganz normal (halt so, dass sie nicht geloescht wird). Dann setzt du den filepointer mit fseek o.ae. dahin, wo du ihn haben moechtest, zum Beispiel auf den Anfang.
-
hmm.... ok danke schonmal;) Das mit der Syncronisation hab ich mir gedacht... aber ist glaub gar nicht notwendig, das die WinCC umgebung nur ein C- funktion gleichzeitig ausführt:)
stimmt fseek.. hab ich schon mal vor jahren wa gemacht;) d.h. an der stelle wo fseek steht, werden die Byte überschrieben
-
Ich hatte schon mal ähnliches Problem. Jedoch hab ichs nicht geschafft, Daten irgendwo vorne anzuhängen sondern immer nur hinten.
quelle = fopen(file,"a"); fseek(quelle, 0L, SEEK_SET);
Würde das so passen, um am Anfang der Datei zu schreiben??
mfg rb
-
Nein - im Append-Modus ignoriert C die Schreibpositionierung und packt ALLE Daten ans Dateiende, zum Überschreiben benötigst du "r+" (Lesen und (Über)schreiben).
@Boris: Ist eigentlich die tägliche Datenmenge konstant oder schwankt die je nach Bedarf?
-
Die datenmänge ist "eigentlich konstant"! es wird bspw. angegeben das jede Stunde geloggt wird, dann sind es 24 datensätze! Aber das intervall kann auch geändert werden!
wenn ich die datei mit "w+" öffne kann ich aber daten in der mitte anfügen oder?
-
BorisDieKlinge schrieb:
Die datenmänge ist "eigentlich konstant"! es wird bspw. angegeben das jede Stunde geloggt wird, dann sind es 24 datensätze! Aber das intervall kann auch geändert werden!
Das ist schonmal ein Vorteil (btw, läuft dein System auch rund um die Uhr?)
wenn ich die datei mit "w+" öffne kann ich aber daten in der mitte anfügen oder?
Ja, könntest du - dummerweise wird die Datei beim Öffnen gelöscht und leer neu angelegt.
(jeder Modus hat seine Vorteile)
-
achso r+ verwenden wenn datei schon existiert, wenn sie neu angelegt werden muss dann w+?
Ja das system läuft immer, also kann jahre lang online sein..
-
Christoph schrieb:
Wenn alle Datensaetze gleich gross sind kannst du einfach wieder anfangen die Datei von vorne beginnend zu ueberschreiben. Rotierend, sozusagen.
Das halte ich auch für die beste methode. einfach mit fseek zu der position springen, die den neuen anfang darstellen soll und bis zum ersten '\n' lesen (oder 24/168/... für einen tag/eine woche/...). dann musst du dir noch merken wie viel unten gelesen/oben geschrieben wurde, damit du nicht in den falschen zeilen rumschreibst. alles was nach untenhin dann überschrieben wird, steht bis dahin schon wieder oben - dir geht also nix verloren.