[gelöst] Welchen Containertyp

Alles rund um die Programmierung mit Qt
Antworten
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

[gelöst] Welchen Containertyp

Beitrag 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?
Zuletzt geändert von sascha am 28. März 2006 07:00, insgesamt 2-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

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

Beitrag von upsala »

Da du in diesem Fall deine Daten sowieso immer alle durchsuchen mußt, wäre ein schneller Indexzugriff sinnvoll. Also QVector.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

oder ein Hashset
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag 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?!
diavo
Beiträge: 11
Registriert: 14. Oktober 2005 10:04

QByteArray

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

Beitrag 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.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Ja das schon, aber wenn ich zb. den Slot slot1() mehrfach hintereinander aufrufe, wird diese Mehrfachaufrufe nicht gleichzeitig ausgeführt.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Das kann ja auch nicht gehen, die können nur nacheinader ausgeführt werden.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Eben das möchte ich nicht. Aber wenn es keine eingebaute Möglichkeit gibt, muss ich das komplexer umschreiben.
Antworten