Seite 1 von 1

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

Verfasst: 7. Februar 2008 10:14
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

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

Verfasst: 7. Februar 2008 11:27
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.

Verfasst: 7. Februar 2008 11:30
von upsala
Wer liefert überhaupt diese Datenmengen?

Verfasst: 7. Februar 2008 17:48
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?

Verfasst: 7. Februar 2008 19:11
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...

Verfasst: 7. Februar 2008 22:22
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?

Verfasst: 8. Februar 2008 07:09
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).

Verfasst: 8. Februar 2008 07:19
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.

Verfasst: 8. Februar 2008 13:12
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 ;)

Verfasst: 13. Februar 2008 15:20
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