[solved] Dynamische Datenstruktur bläht sich (unnötig?)
[solved] Dynamische Datenstruktur bläht sich (unnötig?)
Hallo,
Ich habe Daten zu speichern, von denen ich allerdings zu Beginn der Laufzeit nicht weiß, wie viele Datensätze es werden.
Daher war meine Idee einen Struct in eine Verkettete Liste zu implementieren.
In diesem struct werden dann meine QStrings, Integer und Double-Werte gesichert.
Durch die Verkette Liste kann ich nun also jederzeit ein neues Ketten-Glied erstellen, sodass ich theoretisch belieblig viele Werte sichern kann.
Problem ist jedoch, dass sich diese Datenstruktur - meiner Ansicht unnötig - viel Speicher aneignet (so ca 40MB/Sekunde), sodass selbst 4GB RAM nach ca 100 Sekunden völlständig aufgebraucht sind.
Unnötig, da sobald ich diese Werte auf Festplatte abspeichere die Größe auf ca 1/10 zusammenschrumpft.
Gibt es eine andere Art, eine dynamische Datenstruktur zu bauen, die ggf. etwas sparsamer ist?
Die Daten direkt auf Festplatte zu schreiben ist - zumindest auf die bereits versuchten Arten - keine Lösung, da ansonsten die Brechnungen in Stottern kommen.
Schonmals jetzt vielen Dank für eure Bemühungen
Gruß
Mac
Ich habe Daten zu speichern, von denen ich allerdings zu Beginn der Laufzeit nicht weiß, wie viele Datensätze es werden.
Daher war meine Idee einen Struct in eine Verkettete Liste zu implementieren.
In diesem struct werden dann meine QStrings, Integer und Double-Werte gesichert.
Durch die Verkette Liste kann ich nun also jederzeit ein neues Ketten-Glied erstellen, sodass ich theoretisch belieblig viele Werte sichern kann.
Problem ist jedoch, dass sich diese Datenstruktur - meiner Ansicht unnötig - viel Speicher aneignet (so ca 40MB/Sekunde), sodass selbst 4GB RAM nach ca 100 Sekunden völlständig aufgebraucht sind.
Unnötig, da sobald ich diese Werte auf Festplatte abspeichere die Größe auf ca 1/10 zusammenschrumpft.
Gibt es eine andere Art, eine dynamische Datenstruktur zu bauen, die ggf. etwas sparsamer ist?
Die Daten direkt auf Festplatte zu schreiben ist - zumindest auf die bereits versuchten Arten - keine Lösung, da ansonsten die Brechnungen in Stottern kommen.
Schonmals jetzt vielen Dank für eure Bemühungen
Gruß
Mac
Zuletzt geändert von macpret am 13. Februar 2008 15:20, insgesamt 1-mal geändert.
I divided by NULL - Buuuuuh 
Re: Dynamische Datenstruktur bläht sich (unnötig?) auf-Abhil
Da wir nicht wissen wie es jetzt gemacht wird, kann man nicht sagen ob es sparsamer geht.macpret hat geschrieben:Gibt es eine andere Art, eine dynamische Datenstruktur zu bauen, die ggf. etwas sparsamer ist?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Welchen Speicherbedarf die Qt4-Container benötigen kann man sich hiermit ausrechnen. Da die Daten mehrmals über den (PCI-)Bus müssen und der nicht unbegrenzten Durchsatz hat, hat mich die Quelle interessiert. Und eine Struktur, die wir nicht kennen, können wir nicht beurteilen...
Hier ist der struct, welches ein Glied in der verketteten Liste darstellt.
Hilft dies weiter?
Wenn ich die Seite richtig verstehe währe ein Vector oder ähnliches sparsamer im Speicherverbrauch. Oder sehe ich das falsch?
Code: Alles auswählen
struct Log_records
{
double TrajectoryXERE, TrajectoryYERE, TrajectoryXiE2R, StreetX, StreetY, StreetPsi,
StreetKappa0, StreetDeltaKappa, Time, X, Y, Vx, Psi, PsiDot;
double TrajectoryX[100000], TrajectoryY[100000];
QString Input1, Input2, Input3, Input4, Input5, Input6;
Log_records *next;
};
Hilft dies weiter?
Wenn ich die Seite richtig verstehe währe ein Vector oder ähnliches sparsamer im Speicherverbrauch. Oder sehe ich das falsch?
I divided by NULL - Buuuuuh 
Deine Struktur ist 1,6MByte groß, somit brauchst du nur 25 Datensätze/Sekunde um das von dir beschriebene Datenvolumen zu erreichen.
Somit helfen dir auch die Qt-Container nicht weiter, da auch diese diesen Speicherbedarf nicht mehr optimieren können.
Außerdem läßt deine letzte Antwort und deine ursprüngliche Frage keinen Zusammenhang mit Qt erkennen (somit hier eigentlich OT).
Somit helfen dir auch die Qt-Container nicht weiter, da auch diese diesen Speicherbedarf nicht mehr optimieren können.
Außerdem läßt deine letzte Antwort und deine ursprüngliche Frage keinen Zusammenhang mit Qt erkennen (somit hier eigentlich OT).
Müssen TrajectoryX und Y wirklich so groß sein? Oder ist das ein Maximum was vielleicht mal erreicht wird? Eine entsprechende QList oder QHash wäre dann wohl sparsamer.macpret hat geschrieben:Code: Alles auswählen
struct Log_records { double TrajectoryXERE, TrajectoryYERE, TrajectoryXiE2R, StreetX, StreetY, StreetPsi, StreetKappa0, StreetDeltaKappa, Time, X, Y, Vx, Psi, PsiDot; double TrajectoryX[100000], TrajectoryY[100000]; QString Input1, Input2, Input3, Input4, Input5, Input6; Log_records *next; };
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
So ein rießiges Feld, wie die 2 Trajectory(X/Y) belegen allein schon ~0.8MB das mal 2 wären wir bei rund 1,6MB und dann das ganze 1000mal im Ram haste schon 1,6GB belegt. Daher wäre hier mit Sicherheit eine QList<T> oder halt ein eigener Pointer angebracht, nur so kannst Du schonmal die ganze Sache optimieren. Ausser Du brauchst wirklich einen solchen Speicher dann kann man da nicht mehr viel optimieren oder aber lieber mal schauen ob die Datensätze wirklich einen solchen rießigen Speicher brauchen.
Gut Schuß
VuuRWerK
Gut Schuß
VuuRWerK
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)