> Derzeit halte ich in einem Array 5 Millionen Datensätze vor und dieses Array 
> durchsuche ich
> mit indexof. Die Suche dauert max. 125ms.

Probiere erstmal was Anderes:

Indexof schaut sich ja blind jedes Array-Element, vom ersten zum
letzten, an, und vergleicht es mit dem Suchtext, bis es einen gefunden
hat.

Das könnte man evtl. schon enorm beschleunigen, indem du das Array
sortierst und dann eine Binärsuche durchführst:

Dazu schaust du dann zwar selbst die Elemente an und vergleichst sie
mit Strcomp oder =, aber du gehst nicht von 0 bis N-1 (N = Anzahl),
sondern fängst in der Mitte des Arrays an und vergleichst mit "if
suchtext < array(i)" - wenn true, dann ist der Suchtext "kleiner" als
das Element in der Mitte des sortierten Arrays, d.h. du brauchst
schonmal die untere Hälfte nicht mehr weiter durchsuchen. Also machst
du weiter mit der oberen Hälfte, und schaust dort ebenfalls wieder in
die Mitte des verbliebenen Hälfte. Und so weiter, bis der zu
durchsuchende Teilbereich nur noch aus einem Element besteht, was also
der Treffer ist.

Ach so - das klappt natürlich nur, wenn du Datensätze suchst, die mit
dem suchstring _beginnen_. Aber das tust du ja, wenn du indexof
verwendest, also sollte obige Optimierung auf jeden Fall helfen. Nur
das einmalige Sortieren wird eine Weile brauchen, dafür sind die
Suchen dann viel viel schneller.

Nun zu SQLite:

Es kann schneller sein, denn wenn du dort dann angibst, dass die DB
einen "index" für diese Array-Elemente anlegen soll, baut es evtl.
genau so eine sortierte Liste auf, die es dann binär durchsuchen kann,
wie oben beschrieben. Der (kleine) Nachteil ist, daß sqlite dafür mehr
disk-speicher braucht, weil es nicht nur die Daten sondern auch den
Index getrennt speichert.

-- 
Thomas Tempelmann, http://www.tempel.org/
Follow me on Twitter: http://twitter.com/#!/tempelorg

Antwort per Email an