Seite 1 von 1

[gelöst] Welchen Containertyp

Verfasst: 24. März 2006 09:00
von sascha
Hallo!

Ich wollte mich mal erkundigen, welche Erfahrungen so vorliegen...
Brauche demnächst einen ContainerTypen, der viele Datensätze (10000 und mehr) in sich trägt und in dem die Suche möglichst schnell abläuft...
Was nimmt man denn da unter QT am besten?

Verfasst: 24. März 2006 21:52
von upsala
10000 sind nicht unbedingt viel und es wäre interessant zu wissen, was du für Datensätze hast und wonach du suchen willst

Verfasst: 25. März 2006 14:13
von sascha
OK dann sag mir doch mal, wo "viel" anfängt... Eventuell hat isch mein "Problem" dann ja auch erledigt...
Aber ansonsten werden Datensätze abgespeichert, die Geo-Koordinaten und Bildkoordinaten enthalten. Dann sollen die Geo-Koordinaten durchsucht werden, um einen "Puffer" zu berechnen.
Dafür sollen alle x gefunden werden, für die gilt geo-x1 < x < geo-x2
und das selbe für y. Dann bekomme ich eine Liste von Punkten, zu der ich wiederum die Distanzen vom aktuellen Punkt zu allen anderen "selektierten" Punkten berechnen muss.

Verfasst: 25. März 2006 21:26
von upsala
Da du in diesem Fall deine Daten sowieso immer alle durchsuchen mußt, wäre ein schneller Indexzugriff sinnvoll. Also QVector.

Verfasst: 25. März 2006 22:05
von BartSimpson
oder ein Hashset

Verfasst: 26. März 2006 19:29
von sascha
Hallo alle zusammen!

Also ich habe noch mal genau nachgerechnet und muss somit mein Thread etwas verändern bzw. erweitern....
Also ich habe festgestellt, dass ich mit Textdateien arbeiten werde, die bis zu 1 Million Zeilen haben könnten....
Nun habe ich mal einen ganz einfach eTestlauf gemacht und musste feststellen, dass ein reines lesen mittels readLine() schon an die 40 Sekunden bei 500.000 Zeilen benötigt... Schalte ich nun noch das splitting ein, sind wir schon bei > 2 Minuten....
Gibt es eine Möglichkeit so große Dateien effektiv zu nutzen?
Ich bräuchte nur eine Möglichkeit das File schnell zu parsen, damit ich nur die benötigten Werte speichern muss...
Habe mal was von "memory mapped files" gelesen, kann damit aber nichts anfangen....

Also wenn Ihr eine Idee habt?!

QByteArray

Verfasst: 27. März 2006 08:18
von diavo
Hallo,
also um schnell eine Datei auszulesen ist, wie du schon gemerkt hast, Zeile für Zeile lesen extrem langsam.
Besser ist es, die Datei mit QFile::readAll komplett einzulesen, das ganze in ein QByteArray(Binär) bzw. einen QString(Text) zu speichern und diesen dann mittels eines QDataStreams bzw QTextStreams zu parsen. Da kannst du dann auch wieder readline benutzen.

Verfasst: 27. März 2006 10:25
von upsala

Code: Alles auswählen

QFile::readAll
könnte vielleicht etwas Speicher brauchen :)

Alternativ könnte man auch

Code: Alles auswählen

QFile::read(qint64 maxSize)
verwenden und die Datei Blockweise einlesen. KDE::KIO macht dies z.B. so und scheint dafür für lokale Dateien Blockgrößen von 32kByte zu verwenden.

Außerdem könnte man vielleicht das ganze noch in einen QThread auslagern.

Verfasst: 27. März 2006 11:12
von BartSimpson
Thread ist für sowas immer gut, da das eigentlich Programm nicht einfriert, was dem Nutzer sonst zu einem voreiligen kill -9 veranlassen könnte.

Verfasst: 28. März 2006 17:16
von Nassian
Vielleicht wäre die Frage einen eigenen Thread wert, aber ich stell sie hier mal:

Ich habe eine Klasse von QThread abgeleitet, nun ist es aber doch so, dass nur die run() Methode parallel läuft. Da ich aber den meisten Code (eigentlich den ganzen) in Slots und ein paar private Funktionen habe, bringt es mir kaum etwas. Gibt es eine Möglichkeit Slots zb. parallel ausführen zu lassen, oder diese privaten Funktionen? Oder kann man wirklich nur das in run() parallel ausführen?

SG Alexander

Verfasst: 28. März 2006 17:31
von BartSimpson
Die run Funktion starten den Thread. Dann kannste du über Signal/Slot oder evnets mit dem Thread kommunizieren. In der run Funktion must du nur am Schluss schreiben exec() damit er nicht gleich zu Ende ist, sondern auf Events wartet.

Verfasst: 28. März 2006 23:41
von Nassian
Ja das schon, aber wenn ich zb. den Slot slot1() mehrfach hintereinander aufrufe, wird diese Mehrfachaufrufe nicht gleichzeitig ausgeführt.

Verfasst: 29. März 2006 08:47
von BartSimpson
Das kann ja auch nicht gehen, die können nur nacheinader ausgeführt werden.

Verfasst: 29. März 2006 10:56
von Nassian
Eben das möchte ich nicht. Aber wenn es keine eingebaute Möglichkeit gibt, muss ich das komplexer umschreiben.