Speicheraddressierung / Structs
-
Moin,
ich habe ein gameserver projekt fuer ein RPG, da ziehmlich viele spieler gleichzeitig spielen ist das mit dem 'saving' in die db sonne sache.. (mysql is eben net sooo performant xD) najo auch egal
meine eigentliche frage ist
wenn ich jetzt nen struct habezb:
struct blaaa { int lol; short lala; char blub[10]; struct xyz inventory[300]; int rofl; }
und ich wuerde dieses struct direkt per memcpy in die db saven und genauso wieder laden .. waere ja recht schnell nur -> ich habe gehört das die speicheraddressierung compiler abhängig ist, ich arbeite mit gcc3.4 @ linux
wenn ich den scheiss jetzt unter cygwin mit gcc-3.3 compile, kann es dann sein das man dann die Datenbanken nichtmehr lesen kann (damit meine ich das die anordnung anders is da ja nen short nur 2 byte hat .... da es dann ja ggf. mit null aufgefüllt wird bis wieder 4 byte voll sind) ....ich hoffe ihr versteht was ich meine O.o
Bye Sirius
-
und deine frage?
wie willst du das in die db memcpy()en?
-
BLOB
-
Morgen Sirius_Black, du kannst Daten nicht per memcpy() in eine Datenbank schreiben. Dafür musst du SQL nutzen...und da stellt sich die Frage ob es wirklich Sinn macht mit Datenblöcken wie du ihn beschrieben hast zu arbeiten.
Sirius_Black schrieb:
mysql is eben net sooo performant
Hast du das überhaupt mal ausprobiert? Ich weiß zwar nicht wie groß dein Projekt ist bzw. wird nur sollte MySQL für den Anfang doch ausreichelt performant sein.
-
das problem ist nicht der typ der spalte in der DB, das Problem was ich habe / meine ist, das ich gehört habe das ein struct compilierabhängig is, wenn ich jetzt die software @ linux mit gcc-3.4 compiled hab, da ist jetzt per memcpy() etwas direkt gespeichert (nen gesamtes struct) und ich will diese daten z.B. auf ner windoof kiste usen und das prog wurde mit cygwin - gcc-3.3 oder MS VC compiled.. soweit ich weiss kann es dann passieren das des netmehr passt, da ich ja einfach die daten wieder aus der spalte auslesen wuerde und ins struct packen.
MySQL ist ausreichend ja, aber nicht wenn du 1200 datensaetze pro spieler alle 30 sekunden speicherst bei 250 spielern... brauchs dann ~20% cpu ... somit wuerde ichs binary speichern weil dann nurnoch effektiev 1 datensatz da waer.
MfG Sirius
-
Herrmann schrieb:
du kannst Daten nicht per memcpy() in eine Datenbank schreiben
Sirius_Black, vielleicht ist dir das noch nicht klar.
Ja, natürlich haben verschiedene Compiler und Versionen auch verschiedene Alignments. Auch die Bytefolge könnte sich ändern, wenn du auf anderen Architekturen bist.
Wo bleibt deine Frage?
Wenn du solche Performanceprobleme hast, würd ich mir lieber mal überlegen, ob du wirklich alle 1200 Datensätze alle 30 Sekunden für jeden Spieler speichern musst.
-
giebts da irrgend eine 'fertige' performante moeglichkeit das zu 'serialisieren' so wie in 'php' serialize() ? ^^
Das war dann eigentlich die frage, war mir nicht sicher ob es stimmte.Danke schonmal
Sirius
-
sprintf formatiert in lesbare formate.
ansonsten sind structs am besten.
-
@c.rackwitz
aber nur dann wenn man
- Alignment nicht beachten muss.
- Byteordering nicht beachten muss.
- und wenn keine Konsistenzchecks über die Files macht, da einenm sonst die stuffing bytes wahnsinnig machen.Hat man viele Integer und float Zahlen in einer Struktur, so ist die binaere Speicherlösung die günstigere bezüglich Speicherverbrauch und somit Schreibgeschwindigkeit. Habe ich allerdings hauptsächlich strings verbrauche ich mehr Platz und brauche länger als wenn ich als ASCII speichere.
MfG