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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rene K. (xdraconix)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.