XML Erfahrungsbericht/Ratschlag
-
Hallo,
mein Programm sammelt Daten und schreibt es in einen shared-Memory Bereich. Programm die Daten anzeigen/auswerten wollen lesen von diesem Memory-Bereich und zeigen die Daten an.
Somit habe ich kein Problem beim schreibe/lesen. Alles kann gleichzeitig geschehen.
Um zu wissen welche Daten an welcher Stelle stehen habe ich eine Datei mit Datennamen angelegt.z.B.
Temp_Maschine_1
Temp_Maschine_2
Temp_Maschine_3Wenn ich nun die Temperatur von Maschine 2 lesen will lese ich die Datei aus und sage "Temp_Maschine_2" steht in der 2. Zeile, somit lese ich im shared-Memory Bereich von der 2. Variable.
So funktioniert mein Programm bis jetzt.Nun möchte ich aber mein Programm etwas standardisieren und die Daten in eine XML-Datei schreiben
<maschine_1>
<Temp_1>11</Temp_1>
<Temp_2>22</Temp_2>
</maschine_1>Nebenbei könnte ich auch Zusatzinformationen in die XML-Zeile schreiben
z.B.
<maschine_1>
<Temp_1 typ="C" nachkomma="2">11</Temp_1>
<Temp_2 typ="C" nachkomma="3">22</Temp_2>
</maschine_1>Ich hätte hier das Problem das die Datei beim schreiben sperren muss, damit kein anderes Programm lesen kann.
Auch müsste ich die XML-Datei alle Sekunde, wenn neue Daten kommen, auf die Festplatte schreiben.
Ich bekomme die Daten in einer Liste von 1-X
Ich ordne zu 1. Daten -> 1 Zeile von Maschine_1, also Temp_1
Ich ordne zu 2. Daten -> 2 Zeile von Maschine_1, also Temp_2Somit brauche ich eine XML-Library die mir beim lesen der XML-Datei alle Unterelemente von z.B. "maschine_1" in einer Liste bringt, die jedoch nicht verändert (sortiert) wird. Dann kann ich auf 1. Untermenü -> 1. Daten schreiben usw.
Hier brauche ich von euch ein paar Ansatzpunkte, Erfahrungen, Anregungen usw. mir raucht der Kopf weil ich nicht weiß, soll ich oder nicht meine kompletten Programme umstellen. Ein einfacheres Handling wäre es auf jeden Fall. Ich möchte ganz einfach auf meine Daten oder auch Parameter der Daten per "Namen" zugreifen, das funktioniert jetzt zwar auch schon, aber über Umwege und Tricks.
Ich dachte mir XML ist einfach, es gibt gute Editoren zum erstellen bzw. Programme zum darstellen der XML-Datei.Vielleicht gibt es ganz andere Ansätze die ich noch gar nicht beachtet habe. z.B. eine Datenbank nur im Arbeitsspeicher wäre auch nicht schlecht.
usw. usw.
Bitte um rege Diskussion
Danke
-
Warum schreibst du die Tabelle mit den Offsets nicht an den Anfang des Shared Memory-Bereichs? Ich finde XML macht hier keinen Sinn, vor allem im Vergleich zu dem Overhead.
-
Hallo Rüdiger,
wie meinst du das mit der Offset Tabelle ??
Meinst du vielleicht 2 Tabellen
Tabbelle 1......Tabelle 2
Name1...........Wert1
Name2...........Wert2
usw.Natürlich ist das Shared Memory schneller, "einfacher" im gewissen Sinn.
Jedoch kann kein "Standarprogramm" darauf zugreifen, ich muss immer etwas selbst schreiben. Hier wollte ich an meinen Programmen etwas "standardisieren"Ich weiß selbst nicht, wie ich es einfacher machen könnte. XML hätte den Vorteil das ich zusätzliche Info je "Name/Wert" mit eintragen könnte.
Danke
worst_case
-
Mit welchem Standardprogramm willst du darauf zugreifen, dass dein XML-Format sofort verarbeitet?
Sinnvoller wäre vielleicht eher eine CSV-Datei, da einfacher zu schreiben, parsen und wird von den meisten Programmen (zB. allen Tabellen-Calcs) verstanden. Erweitern könntest du es auch, in dem du mehr Daten pro Zeile einfügst.
Das Problem mit dem sperren der Datei könntest du umgehen, in dem du die Daten in einem Rutsch schreibst (unter Linux sind zB AFAIK 4096 Byte ein "atomic write/read").
-
Abend,
CSV Formatierung ist nicht schlecht, hier gibt es Parser in Perl, wird von mir zur Anzeige im Browser benutzt.
Ich sollte dann z.B. so formatieren
# Ort ; Name ; Wert ; irgend welche Parameter
Keller; Temp_1; 23 ; 00.00
Keller; Temp_2; 21 ; 00.00
Garage; Temp_1; 21 ; 00.00
Garage; Temp_2; 21 ; 00.00
usw.Das wäre schon mal eine Standardisierung meiner Programme.
Gibt es hier einen Parser für C ??
"atomic write/read"
Ich habe etwas im Google gestöbert. Hört sich wild an. Ich habe noch nie etwas damit gemacht. So wie du geschrieben hast liegt die Grenze bei ca. 4k. Gibt es hier ein kleines Beispiel wenn möglich in Deutsch, wenn nicht... auch nicht so schlimm. Ich will nur einmal den Ablauf der Programmierung einsehen können. Einfach Daten in eine Variable schreiben und in einem Rutsch eine Datei erstellen.Gruß
-
du musst das shared memory auch vor gleichzeitigem zugriff schützen, da sonst clients möglicherweise daten auslesen, während der server schreibt.
-
Hallo,
mein shared-memory habe ich nicht "ge-lock't"
Hier speichere ich nur Messwerte. Somit ist es kein Problem wenn gleichzeitig gelesen und geschrieben wird. Entweder wird der alte oder der neue Wert gelesen. Hier gibt es kein Problem, wie in einer Datei, denn der shared-memory Bereich wird nicht neu erzeugt bzw. gelöscht vor dem schreiben.Danke
worst_case
-
"atomic write/read"
Ich habe etwas im Google gestöbert. Hört sich wild an. Ich habe noch nie etwas damit gemacht. So wie du geschrieben hast liegt die Grenze bei ca. 4k. Gibt es hier ein kleines Beispiel wenn möglich in Deutsch, wenn nicht... auch nicht so schlimm. Ich will nur einmal den Ablauf der Programmierung einsehen können. Einfach Daten in eine Variable schreiben und in einem Rutsch eine Datei erstellen.Damit meinte ich eigentlich gewohnt man: write(2)/man: read(2). Die schreiben alle Daten in einem Rutsch, die kleiner als 4k sind.
CSV Parser für C zu finden, sollte nicht schwer sein. Das Format ist ja sehr sehr simpel.
-
Hallo,
die 4k Daten würden für mich reichen.
Wie sieht es aber aus wenn Programm 1 die Datei zum lesen öffnet -> Taskwechsel und Programm 2 öffnet die Datei zum schreiben.
Taskwechsel zurück zum Programm 1. Was liest nun Programm 1.Wichtig ist nicht ob neue oder alten Daten, sondern nur ob überhaupt "richtige" Werte/Daten gelesen werden.
Gruß
worst_case