title image


Smiley Re: Array mit vielen Mio Werten ordnen. Was ist die schnellste Variante?
Hi,



also so mal meine Idee:



Erzeugt eine temporäre Datenbank

Erzeugt darin eine Tabelle

Füllt die Tabelle mit dem Array

Sortiert die Tabelle beliebig absteigend oder aufsteigend

Schreibt die Tabelle zurück ins Array

Löscht sich wieder



notwendig ist hierzu ein Verweis auf die Microsoft DAO Object Library 3.51 oder 3.6.

(siehe Extras->Verweise)



das Beispiel geht davon aus, dass das Array aus Strings besteht. Bei Zahlen muss

man den SQL - String etwas ändern sowie das Feld. Die Routine hat den Vorteil, dass

damit beliebig dimenionierte Array's sehr schnell beliebig sortiert werden können.





Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" ( _

ByVal lpszPath As String, _

ByVal lpPrefixString As String, _

ByVal wUnique As Long, _

ByVal lpTempFileName As String) As Long

'



'Funktion erfordert einen Verweis auf die DA0 Object TLB

'nSort = False sortiert aufsteigend

'nSort = True sortiert absteigend

Private Sub DBSort(ByRef ArrayToSort As Variant, ByVal nSortDirection As Boolean)

Dim DB As Database

Dim sTmpFile As String * 256

Dim sql As String

Dim i As Long

Dim rs As Recordset



GetTempFileName "C:\", "", 0, sTmpFile

Kill sTmpFile

Set DB = DBEngine.CreateDatabase(sTmpFile, dbLangGeneral)

sql = "CREATE TABLE THEARRAY (ARVAL TEXT (255)"

sql = sql & ", CONSTRAINT PrimKeyS PRIMARY KEY(ARVAL))"

'Create Table

DB.Execute sql



'Write Table

For i = LBound(ArrayToSort) To UBound(ArrayToSort)

sql = "Insert Into THEARRAY (Arval) Values('"

sql = sql & ArrayToSort(i) & "')"

DB.Execute sql

If i Mod 30 Then DoEvents

Next



'Sort Table

If nSortDirection = True Then

sql = "SELECT ARVAL FROM THEARRAY ORDER by ARVAL DESC"

Else

sql = "SELECT ARVAL FROM THEARRAY ORDER BY ARVAL ASC"

End If

Set rs = DB.OpenRecordset(sql, dbOpenSnapshot)



'Read Table

For i = 0 To UBound(ArrayToSort) - 1

ArrayToSort(i) = rs.Fields(0).Value

rs.MoveNext

If i Mod 30 Then DoEvents

Next



'Cleanup

rs.Close

Set rs = Nothing

DB.Close

Set DB = Nothing

Set DBEngine = Nothing

Kill sTmpFile

End Sub



Aufruf:



DBSort DeinArray(), True



Dann gucken wir mal, wie schnell das läuft ;) Ich habe ausdrücklich DAO verwendet,

weil DAO auf die JetEngine abgestimmt ist und signifikant schneller läuft als ADO.



Man serviere es mit einem schnuckeligen Fortschrittsbälckchen.


Programmierst Du noch frei oder wirst Du schon von Microsoft verwaltet ( .NET)?



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: