Forum: PC-Programmierung C# - wie große Datenmengen speichern.


von Rene K. (xdraconix)


Lesenswert?

Ich speichere mir Sensorwerte über einen selbst geschriebenes Programm 
in einer CSV Datei in folgendenem Format: 
(TIME);(float);(float);(float);(uint8)

Der Zeitwert ist ein Unix Timestamp, Die Flaotwerte sind 2+1 stellig und 
die Uint8 ist 1 Byte groß. Üblicherweiße sieht also ein Datenpaket 
folgendermaßen aus:

1477128402;11.2;14.5;23.5;i

Nun speichere ich das Datenpaket alle 10 Sekunde in die gesagte CSV und 
möchte sie nun mit einem zweiten Programm graphisch darstellen lassen. 
Da stellt sich mir die Frage wie ich am besten diese Werte dann 
vorhalte. Bei zwei Wochen kommen dann ja schon immerhin 120.000 
Datensätze zustande.

Da ich diese Datensätze nur Zeitbedingt anhand des Timestamp auswerten 
will, muss ich mir sie ja irgendwo vorhalten. Da nun zu meiner Frage:

Wie macht man das am besten? Die Daten allesamt jeweils in Array 
speichern? Die Daten sequentiell aus der Datei lesen? Oder man sich 
diese Daten aus der Datei ließt und in eine Temporäre Datenbank schreibt 
und von dort aus ließt?

von (prx) A. K. (prx)


Lesenswert?

Jeder einzelne Wert auf Dauer:
https://de.wikipedia.org/wiki/Berkeley_DB

Zeitlich gestaffelt zusammengefasst mit Grafikerstellung:
https://de.wikipedia.org/wiki/RRDtool

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Rene K. schrieb:
> Nun speichere ich das Datenpaket alle 10 Sekunde in die gesagte CSV

Jedenfalls würde ich die Timestamp nur einma am Anfang schreiben und 
dann weglassen. Du kennst ja dann die anderene Zeitpunkt trotzdem.
Das spart vermutlich 50% Platz.

Gruß Klaus

von Peter II (Gast)


Lesenswert?

Klaus schrieb:
> Jedenfalls würde ich die Timestamp nur einma am Anfang schreiben und
> dann weglassen. Du kennst ja dann die anderene Zeitpunkt trotzdem.
> Das spart vermutlich 50% Platz.

halt ich für eine schlechte Idee. Was ist wenn die Aufzeichnung nur 9.95 
Sekunden dauert? Man sollte zumindest regelmäßig die Zeit Speichen.

> Bei zwei Wochen kommen dann ja schon immerhin 120.000 Datensätze
> zustande.

und wo soll das das Problem sein? Selbst wenn jeder Datensatz 40byte 
groß ist, dann sind winzige !!4Megabyte!!!

selbst wenn du es 10Jahre lang so machst, sind das nicht mal 1GB.

Also unter groß versteht man in der aktuellen Zeit etwas anders.

von Noch einer (Gast)


Lesenswert?

> selbst wenn du es 10Jahre lang so machst, sind das nicht mal 1GB

Kommt darauf an, was die graphische Darstellung alles können soll.

Willst du eine 10-Jahres Übersicht zusammenstellen, während der Benutzer 
wartet, sind 1GB verdammt viel. Da braucht es neben dem GB Detaildaten 
zusätzlich 100 kB zusammengefasste Daten. RRDtool hat A.K. ja bereits 
vorgeschlagen.

von Peter II (Gast)


Lesenswert?

Noch einer schrieb:
> Willst du eine 10-Jahres Übersicht zusammenstellen, während der Benutzer
> wartet, sind 1GB verdammt viel. Da braucht es neben dem GB Detaildaten
> zusätzlich 100 kB zusammengefasste Daten. RRDtool hat A.K. ja bereits
> vorgeschlagen.

RRDtool hat aber den großen Nachteil, das Details in der Vergangenheit 
verloren gehen (ok das ist kein Nachteil, ist ja so gewollt). Aber das 
ist teilweise Problematisch weil man nur noch einen  Durchschnitt sieht.

Das geht heute schon in wenigen Sekunden. Und in 10Jahren sind die 
Computer so schnell das es "sofort" da ist.

Es sollte auch kein Problem sein, eine 2.Datei mit einen Durschnitt je 
Tag anzulegen. Dann kann man für die Übersicht diese Datei verwenden und 
für Details die "große" Datei.

von Peter II (Gast)


Lesenswert?

eine 1,1GB große Datei mit dem Zeilen

"1477128402;11.2;14.5;23.5;i"

mit C# zu Parsen und die Summe über das 3. Element dauert 30sekunden.

Alles in eine Liste einzulesen dauert 45 Sekunden. Darüber dann die 
Summe zu bilden dauert dann nur noch 2 Sekunden.


Es ist also überhaupt kein Problem, mit solchen Datenmengen zu arbeiten.

von Kaj (Gast)


Lesenswert?

Ich wuerds mit einer Datenbank machen (SQLite).
Haette den Vorteil (je nach dem was man vorhat), dass man sich sehr 
leicht Zeitraeume holen kann, ohne die Datei von Hand Parsen und 
Zeitstempel vergleichen zu muessen usw.

von Noch einer (Gast)


Lesenswert?

> RRDtool hat aber den großen Nachteil, das Details in der Vergangenheit
> verloren gehen
RRA für 10 Jahre in Sekundenauflösung ist kein Problem. 100 Jahre in 
Sekundenauflösung habe ich noch nicht ausprobiert.

> dauert 30sekunden ... 45 Sekunden ... 2 Sekunden
Hmmm... Habe einen Raspi als Webserver für Datenlogger. Grafik im 
Browser anzeigen dauert 2 bis 5 Sekunden. Finde ich so gerade noch 
erträglich.

Was für CSV spricht - man kann es einfach in Libreoffice einlesen. Aber 
bei 1GB wird das so träge - da kann man nicht mit arbeiten.

Wenn dir noch nicht klar ist, was du brauchst, nimm eine SQL-Datenbank 
mit wenig Overhead. Wenn du genau weisst, du willst diese 3 Zahlen 
loggen und zusammengefasste Auswertungen machen, nimm RRDTools.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.