[solved] Dynamische Datenstruktur bläht sich (unnötig?)

Alles rund um die Programmierung mit Qt
Antworten
macpret
Beiträge: 28
Registriert: 25. September 2007 01:58

[solved] Dynamische Datenstruktur bläht sich (unnötig?)

Beitrag von macpret »

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
Zuletzt geändert von macpret am 13. Februar 2008 15:20, insgesamt 1-mal geändert.
I divided by NULL - Buuuuuh ;-)
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Dynamische Datenstruktur bläht sich (unnötig?) auf-Abhil

Beitrag von macman »

macpret hat geschrieben:Gibt es eine andere Art, eine dynamische Datenstruktur zu bauen, die ggf. etwas sparsamer ist?
Da wir nicht wissen wie es jetzt gemacht wird, kann man nicht sagen ob es sparsamer geht.
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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wer liefert überhaupt diese Datenmengen?
macpret
Beiträge: 28
Registriert: 25. September 2007 01:58

Beitrag von macpret »

Wie ich sagte, es ist ein struct in einer verketteten Liste.

Die Daten kommen von verschiedenen externen Modulen (Differential GPS, Beschleunigungssensor, Lidar-Sensor, Handeingaben, ...) - Aber wofür ist das wichtig?
I divided by NULL - Buuuuuh ;-)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

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...
macpret
Beiträge: 28
Registriert: 25. September 2007 01:58

Beitrag von macpret »

Hier ist der struct, welches ein Glied in der verketteten Liste darstellt.

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 ;-)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

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).
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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;
};
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.
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.
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

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 ;)
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 =)
macpret
Beiträge: 28
Registriert: 25. September 2007 01:58

Beitrag von macpret »

Hatte mich mit den Trajectory um eine 10er Potenz vertan. An sich benötige ich die Anzahl der Werte.

Durch die "Korrektur" kann ich nun aber den Logger ne 10er Potenz länger laufen lassen.

Aber ich werde mir die TLists mal genauer anschauen.

Danke
I divided by NULL - Buuuuuh ;-)
Antworten