Hallo! Eine eher generelle Frage, ob folgendes in C++ moeglich ist (bzw. wie man so etwas aehnliches erzielen kann): Ich muss Daten von der Festplatte lesen, die ein bestimmtes Layout haben, ein Mix aus short, int, float und double. Im Prinzip waere es relativ einfach, wenn das Layout stets das Gleiche waere, man koennte dann einfach einen statischen struct wie z.B. struct data { double xcoordinate; double ycoordinate; int counter; float attribute; }; definieren und sizeof(struct data) einlesen und haette direkt Zugriff auf alle Variablen (ggf. nach byte-swapping, da die Variablen u.U. als big endian abgelegt sind). So weit so gut. Dummerweise kommt es vor, dass manchmal die Reihenfolge der Variablen sich aendert und z.B. "attribute" vor "counter" kommt im obigen Beispiel. Ein statischer struct ist also nicht moeglich (es sei denn, man wollte das Programm stets neu compilieren, das ist aber aus praktischer Sicht nicht moeglich). Das Layout des struct kann ich einfach ueber eine XML Datei beschreiben (Variablen-Name, Typ, Byte-Offset, usw.). Es waere nun schoen, wenn man den struct quasi on-the-fly dynamisch definieren koennte zur Laufzeit. Ist so etwas in der Art moeglich? Meine momentane Loesung funktioniert, ist aber nicht all zu elegant: Die XML Datei wird geparst und es wird in einer Hash-Map abgespeichert, welche Variable an welchem Byte-Offset zu finden ist (z.B. Variable names "counter" ist vom Typ "int" und im obigen Beispiel bei Byte-Offset 16 bis 19 zu finden). Die Daten werden dann schlicht von Festplatte in den Speicher gelesen. Ueber eine Funktion kann dann jede Variable ausgelesen werden, wobei die Hash-Map befragt wird, an welchem Byte-Offset die Variable mit dem Namen sitzt (und welchen Typ sie hat, etc). Gibt es etwas eleganteres als Loesung? Danke fuer Ideen, Thomas -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo Thomas, Am Sonntag, 12. Juli 2009 schrieb Thomas Hertweck:
Hallo!
Eine eher generelle Frage, ob folgendes in C++ moeglich ist (bzw. wie man so etwas aehnliches erzielen kann):
Ich muss Daten von der Festplatte lesen, die ein bestimmtes Layout haben, ein Mix aus short, int, float und double. Im Prinzip waere es relativ einfach, wenn das Layout stets das Gleiche waere, man koennte dann einfach einen statischen struct wie z.B.
struct data { double xcoordinate; double ycoordinate; int counter; float attribute; }; Das sieht sehr übersichtlich aus - ich vermute aber, dass das im realen Programm etwas länger ist?
definieren und sizeof(struct data) einlesen und haette direkt Zugriff auf alle Variablen (ggf. nach byte-swapping, da die Variablen u.U. als big endian abgelegt sind). So weit so gut.
Dummerweise kommt es vor, dass manchmal die Reihenfolge der Variablen sich aendert und z.B. "attribute" vor "counter" kommt im obigen Beispiel. Ein ... Das Layout des struct kann ich einfach ueber eine XML Datei beschreiben (Variablen-Name, Typ, Byte-Offset, usw.). Es waere nun schoen, wenn man den struct quasi on-the-fly dynamisch definieren koennte zur Laufzeit. Ist so etwas in der Art moeglich? Ich denke, dazu fehlen einfach noch ein paar Informationen. Sind die Datentypen fest an die einzelnen Variablen gekoppelt oder wechseln die auch? (z.B. xccordinate mal als double, mal als int) Wenn die fest wären, könntest Du die Daten in einen Speicherbereich einlesen und in dem struct die Variablen als Pointer deklarieren, die Du dann entsprechend dem Aufbau in der Datei passend auf die einzelnen Bestandteile setzt. Oder: Wieviele Kombinationen gibt es für die Reihenfolge der Variablen? Du könntest verschiedene struct definieren und dann passend casten. Passt natürlich nur für eine kleine Menge an Kombinationen und auch nur dann, wenn es Dir sowohl beim Lesen aus der Datei wie auch beim Zugriff auf Performance ankommt.
Gruß Martin -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hi! Martin Hofius wrote:
Am Sonntag, 12. Juli 2009 schrieb Thomas Hertweck:
[...] struct data { double xcoordinate; double ycoordinate; int counter; float attribute; }; Das sieht sehr übersichtlich aus - ich vermute aber, dass das im realen Programm etwas länger ist?
Korrekt. Insgesamt handelt es sich um ca. 200 bis 500 Byte pro struct, ca. 40 bis 100 Variable. Das kann aber variieren.
[...] Ich denke, dazu fehlen einfach noch ein paar Informationen. Sind die Datentypen fest an die einzelnen Variablen gekoppelt oder wechseln die auch? (z.B. xccordinate mal als double, mal als int)
Die Typen und Namen der Variablen koennen fuer dieses Problem glaube ich als statisch angenommen werden. Insofern variiert hier primaer die Position (byte offset) und die Anzahl der Variablen.
Wenn die fest wären, könntest Du die Daten in einen Speicherbereich einlesen und in dem struct die Variablen als Pointer deklarieren, die Du dann entsprechend dem Aufbau in der Datei passend auf die einzelnen Bestandteile setzt.
Ich habe allerdings keine feste Anzahl von Variablen. Wie oben angedeutet kann je nach Format der Datei die Anzahl variieren.
Oder: Wieviele Kombinationen gibt es für die Reihenfolge der Variablen? Du könntest verschiedene struct definieren und dann passend casten. Passt natürlich nur für eine kleine Menge an Kombinationen und auch nur dann, wenn es Dir sowohl beim Lesen aus der Datei wie auch beim Zugriff auf Performance ankommt.
Ne, Kombination bilden ist nicht moeglich bei 80 Variablen oder so ;-) Performance spielt eine recht grosse Rolle. Wie gesagt, ich habe eine Loesung ueber einen Dictionary (Lookup Table), die scheint zu funktionieren. Ich weiss nur nicht, ob sie wirklich elegant und schnell ist oder ob es etwas besseres gibt. Sorry, ich kann das Problem momentan nur relativ abstrakt beschreiben, ich hoffe, es ist trotzdem einigermassen verstaendlich, was ich erreichen will. Gruesse, Thomas -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Hallo, Am Son, 12 Jul 2009, Thomas Hertweck schrieb:
Martin Hofius wrote:
Am Sonntag, 12. Juli 2009 schrieb Thomas Hertweck:
[...] struct data { double xcoordinate; double ycoordinate; int counter; float attribute; }; Das sieht sehr übersichtlich aus - ich vermute aber, dass das im realen Programm etwas länger ist?
Korrekt. Insgesamt handelt es sich um ca. 200 bis 500 Byte pro struct, ca. 40 bis 100 Variable. Das kann aber variieren. [..] Ne, Kombination bilden ist nicht moeglich bei 80 Variablen oder so ;-) Performance spielt eine recht grosse Rolle. Wie gesagt, ich habe eine Loesung ueber einen Dictionary (Lookup Table), die scheint zu funktionieren. Ich weiss nur nicht, ob sie wirklich elegant und schnell ist oder ob es etwas besseres gibt.
Ich habe keine Ahnung, wie das konkret wohl geht[1], aber mir spukt was von "factory-Klasse" im Kopf herum. Wenn die von dieser maßgeschneidert erzeugte / abgeleitete eigentliche Lese-Klasse intern ein struct und C io-Ops (read/mmap ...) verwendet, sollte das eigentlich performant werden können. Oder eine Lese-Klasse mit Template für das struct und nur das struct "generieren" oder so. -dnh [1] und ich bin z.Z. zu müde -- "God, root, what is difference?" - Pitr "God is more forgiving." - Dave Aronson -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
David Haller wrote:
[...] Ich habe keine Ahnung, wie das konkret wohl geht[1], aber mir spukt was von "factory-Klasse" im Kopf herum. Wenn die von dieser maßgeschneidert erzeugte / abgeleitete eigentliche Lese-Klasse intern ein struct und C io-Ops (read/mmap ...) verwendet, sollte das eigentlich performant werden können. Oder eine Lese-Klasse mit Template für das struct und nur das struct "generieren" oder so.
Ueber so etwas hatte ich auch schon gegruebelt, bin aber meist beim "oder so" haengen geblieben... ;-) Cheers, Thomas -- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
participants (3)
-
David Haller
-
Martin Hofius
-
Thomas Hertweck