vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen und Antworten zur vbarchiv.dll
arrFindString sehr langsam 
Autor: d.jeschke
Datum: 15.11.05 15:25

Hallo,
erstmal vielen Dank für diese kostenlose dll.

Aber folgendes Problem beschäftigt mich:

Ich lese in ein Array eine Liste mit ca. 450.000 Einträgen ein.
Nun möchte ich auf doppelte Begriffe im Array prüfen.
Das Array liegt sortiert durch die TextCompare Methode vor.

Das Suchen im Array auf doppelte Einträge sequentiell ist ja keine problem, dauert nur sehr lange. Deswegen habe ich mir die InArray Funktion von D.Otter genommen und lasse dadurch suchen. Dies geschieht sehr sehr schnell.
Der Nachteil dabei ist, dass es keine Möglichkeit gibt auf Groß/Kleinschreibung zu achten.
Deswegen habe ich die arrFindString Funktion aus der vbarchiv.dll ausprobiert.
Der Suchvorgang hierbei ist jedoch ziemlich langsam.
Kann ich davon ausgehen dass die Funktion auch sequentiell arbeitet?

Noch eine Frage:
Ist eine Array Sortierfunktion geplant?

Viele Grüße
Dennis
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: ModeratorMartoeng (Moderator)
Datum: 15.11.05 15:54

450.000 Einträge? Ist das nicht ein bisschen viel!? Da sollte man mal über eine Alternativmethode nachdenken.

Eine Sortierfunktion ist nicht geplant, die gibt's da nämlich schon. arrSortString heißt sie.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: d.jeschke
Datum: 15.11.05 16:17

Hallo Martoeng,

vielen Dank für deine schnelle Reaktion!

Ja, ich habe auch schon über eine Datenbank nachgedacht. Aber als ich das Projekt begann wußte ich selber nicht dass es sich um soviele Einträge handelt.
Meinem Auftraggeber ist aber die Neuerstellung zu teuer.

Die arrSortString Funktion habe ich in der Dokumentation nicht gefunden. Dort wird nur die arrSortByte Funktion beschrieben.
Ich habe aber nun die arrSortString im Besipiel Code gefunden.

Nun noch eine Frage ob ich beim Aufruf der Funktion etwas verkehrt mache.

Zeile = arrFindString(FindList, SuchBegriff, "=", Zeile, EndZeile, 1)

Der Suchbegriff wird in einer Schleife bestimmt der jeweils den nächsten Index im Array markiert. Die Schleife funktioniert einwandfrei und auch die Begriffe werden korrekt übergeben. Trotzdem meldet mir die Funktion -1 zurück.
Eigentlich müßte er aber jeden Begriff mindestens einmal finden.
Was mache ich verkehrt?

Das folgende test Array überprüfe ich auf doppelte Werte:
FindList():

- oder kontraktilität\
%\
%-Creme\
%-Dosis\
%ig\
%-ig\
%ige\
%-ige\
%-igen\
%iger\
%-iger\
%ig-wässrig\
/µl\
/µl\
/cm²\
/m²\
/min\
/nl\
/pl\
/s\
dennis\
dennis\
dennis\
-Drehung\
inga\
inga\


Viele Grüße
Dennis
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: ModeratorMartoeng (Moderator)
Datum: 15.11.05 16:46

Hast Du die neuste Version der DLL?
 
    Dim a(1 To 5) As String
    a(1) = "Null"
    a(2) = "Eins"
    a(3) = "Zwei"
    a(4) = "Drei"
    a(5) = "Vier"
    MsgBox arrFindString(a, "Zwei", "=", 2, UBound(a), 0)
funktioniert bei mir ohne Probleme. Probier mal bei Dir.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: d.jeschke
Datum: 15.11.05 16:58

Ich benutze die version 00.09.0000

Die Declaration erfolgt auf Modulebene:
Public Declare Function arrFindString Lib "vbarchiv.dll" (ByRef Arr() As _
  String, ByVal pSearch As String, ByVal sOperation As String, ByVal nStart As _
  Long, ByVal nEnd As Long, ByVal bUCase As Byte) As Long
Du kannst die ja mal den Code anschauen:

Public Function Optimize(sArray() As String, _
    Optional ByVal sSerachFor As String, _
    Optional ByVal nStart As Variant, _
    Optional ByVal nEnd As Variant) As Long
 
' Sucht zur Zeit nur doppelte Einträge
Dim i As Long
Dim Zeile As Long
Dim CountBegriff As Integer
Dim SuchBegriff As String
Dim LastBegriff As String
Dim LastZeile As Long
 
 
s_txt.Text = ""
 
For i = 1 To EndZeile
    SuchBegriff = flex_data(1).Text(i, 2)
    Zeile = 1 ' Auf aunfang des Grids setzen
    CountBegriff = 0 ' Gefundene Begriffe auf 0
    If LastBegriff = SuchBegriff Then
        Zeile = -1
    End If
 
    Do Until Zeile = -1
 
        'Zeile = flex_data(1).FindItem(SuchBegriff, 2, Zeile, True)
 
        ' Mit InArray Funktion:
        'Zeile = InArray(FindList, SuchBegriff, Zeile)
 
        'arrFindString Funktion:
        Zeile = arrFindString(FindList(), SuchBegriff, "=", Zeile, EndZeile, 1)
        MsgBox ("Gesuchter Begriff: " & SuchBegriff & " Vergleichender String:" & _
          "" & FindList(i) & " Resultat: " & Zeile)
 
 
 
            If Zeile <> -1 Then
                CountBegriff = CountBegriff + 1
                    If CountBegriff > 1 Then ' Wenn der Begriff öfters als 
                    ' einmal auftaucht
                        If CountBegriff = 2 Then
                            flex_data(2).AddItem (vbTab & SuchBegriff & vbTab & _
                              "" & vbTab & flex_data(1).Text(Zeile, 3) & vbTab _
                              & LastZeile)
                            flex_data(2).AddItem (vbTab & "--->" & vbTab & _
                            flex_data(1).Text(Zeile, 2) & vbTab & flex_data( _
                            1).Text(Zeile, 3) & vbTab & Zeile)
                        Else
                            flex_data(2).AddItem (vbTab & "--->" & vbTab & _
                              flex_data(1).Text(Zeile, 2) & vbTab & flex_data( _
                              1).Text(Zeile, 3) & vbTab & Zeile)
                        End If
 
                    Else
                        'flex_data(2).AddItem (SuchBegriff)
                         LastZeile = Zeile
 
                    End If
                    nCount = nCount + 1
                    If nCount Mod 50 = 0 Then
                        DoEvents
                        nCount = 0
                    End If
 
                Zeile = Zeile + 1
                LastBegriff = SuchBegriff
                If Abbruch = True Then
                    Exit Function
 
                End If
 
            End If
 
    Loop
 
    If Abbruch = True Then
        Exit Function
    End If
 
 
    nCount = nCount + 1
    If nCount Mod 50 = 0 Then
        DoEvents
        nCount = 0
    End If
s_txt.Text = i
 
Next i
 
 
cmd_delDoppelte.Enabled = True
 
 
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: Braun
Datum: 16.11.05 13:54

wie sucht diese Funktion die Daten?
Sequentiell, binär oder ..?

Braun
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: arrFindString sehr langsam 
Autor: ModeratorMartoeng (Moderator)
Datum: 19.11.05 15:34

Die Version 0.9 ist es derzeit immer *g*

Warum es hier so langsam ist: arrFindString muss ja erstmal den Speicher anschauen und eigene Variablen dimensionieren. Die Funktion bekommt die Array-Adresse und tut so als wäre es in der eigenen Funktion definiert (bei so vielen Einträgen kann das evtl. ein wenig dauern).
Sie ist nicht dafür ausgelegt, Duplikate zu eliminieren. Das wäre allerdings noch etwas, was man bei Zeiten implementieren kann.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel