Listview grosse Datenmengen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Listview grosse Datenmengen

    Guten Morgen,

    ich fülle ein Listview mit Daten aus einem Textfile. Es geht dabei um ca. 1.6 Millionen Zeilen.
    Für 100.000 Zeilen braucht es etwas mehr als 3 Minuten. Ihr könnt euch sicher vorstellen wo mein Problem liegt.
    Es dauert zu lange.

    VB.NET-Quellcode

    1. Dim RBT As New StreamReader(Application.StartupPath & "\data.txt")
    2. Dim Line() As String = Nothing
    3. ListView1.BeginUpdate()
    4. While Not RBT.EndOfStream
    5. Line = RBT.ReadLine.Split(vbTab)
    6. With ListView1.Items.Add(Line(0))
    7. .SubItems.Add(Line(1))
    8. End With
    9. End While
    10. ListView1.EndUpdate()
    11. RBT.Close()


    Der Code wird natürlich in einem Thread ausgeführt.

    Ich habe sehr viele im Netz gefunden die das gleiche Problem mit der Geschwindigkeit haben aber eine Lösung fand ich nicht.
    Gibt es irgendwas das ich tun kann ?
    Niemand soll sich alle Datensätze angucken :)
    Es wird eine Suchfunktion geben damit man "schnell" findet was man sucht.
    Mit dem VirtualMode habe ich mich nicht ausführlich befasst ich glaube der wird mir bei der Lösung meines Problems auch nicht helfen.
    Ich lasse mich da natürlich auch gerne vom Gegenteil überzeugen.
    Bei VirtualMode ist die Anzahl der Items irrelevant - das geht dann extrem schnell. Ich habe so schon ListViews mit Millionen von Einträgen in einem Bruchteil einer Sekunde gefüllt.
    Man könnte auch die Suchfunktion mit einem Paging-System kombinieren (macht eiglich jede Website so, zb auch Google).

    Also das Paging beschränkt die Anzahl der angezeigten Datensätze auf mw300 - darin kann man noch angenehm scrollen.
    Zusätzlich eine Suchfunktion, welche die Gesamtzahl der Treffer sinnvoll einschränkt.
    Habe eine Lösung gefunden.

    Ich lasse das Listview einfach weg und durchsuche die Textdatei direkt.
    Hab es grad mal gestest und den letzten Datensatz in der Datei gesucht.
    Dauerte ca. 20 Sekunden. Das ist ein akzeptable Zeit.

    VB.NET-Quellcode

    1. Dim RBT As New StreamReader(Application.StartupPath & "\data.txt")
    2. Dim Line() As String = Nothing
    3. While Not RBT.EndOfStream
    4. Line = RBT.ReadLine.Split(vbTab)
    5. If Line(0).Contains("............") Then
    6. MessageBox.Show("ok")
    7. End If
    8. End While
    9. RBT.Close()


    Danke für eure Hilfe

    Team24Nord schrieb:

    durchsuche die Textdatei direkt
    mal mit dieser Methode, die ist ein wenig kürzer:

    VB.NET-Quellcode

    1. Dim Line() As String = Nothing
    2. For Each outerLine In IO.File.ReadLines(Application.StartupPath & "\data.txt")
    3. Line = outerLine.Split(ControlChars.Tab)
    4. If Line(0).Contains("............") Then
    5. MessageBox.Show("ok")
    6. End If
    7. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Team24Nord schrieb:

    Wenn du mir dann noch sagst wie bin ich glücklich


    Ich würde den Text in eine SQlite-DB einlesen und dann erst durchsuchen.
    Das einmalige Einlesen dauert sicher nicht länger als ein paar Sekunden und das Suchen in der DB nur ein Fingerschnipsen - weit unter einer Sekunde.

    Oder den Text ohne DB gleich in ein(e) DataSet/DataTable laden, eine Sicht erstellen und durchsuchen.

    Du könntest nicht zufällig das Textfile mal bereitstellen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „simpelSoft“ ()

    simpelSoft schrieb:


    Ich würde den Text in eine SQlite-DB einlesen und dann erst durchsuchen.
    Das einmalige Einlesen dauert sicher nicht länger als ein paar Sekunden und das Suchen in der DB nur ein Fingerschnipsen - weit unter einer Sekunde.
    Du könntest nicht zufällig das Textfile mal bereitstellen?


    Leider kann ich dir das File nicht senden weil die Datei einfach zu gross ist. Es ist ein Rainbow Table.

    Die Struktur ist einfach:
    MD5-Hash | Plain Text

    Ich hatte dieses Thema eigentlich auch schon als erledigt markiert.
    Inzwischen habe ich die Datei in 16 Dateien geteilt je nachdem mit welchem Buchstaben der MD5-Hash beginnt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Team24Nord“ ()

    Es ist eigentlich total sinnlos sich weiter darüber zu unterhalten. So wie mein MD5 Brute Forcer läuft bin ich zufrieden. Deswegen habe ich das Thema als Erledigt markiert. Dein Tip mit der Datenbank hiflt mir aber vielleicht bei meinem aktuellen Projekt. Es ist ein "RTMP Video Caster" in dem werden auch grosse Datenmengen (Playlisten) verarbeitet und wenn dann jemand aus seiner Playlist schnell was finden muss wäre eine Zeit unter einer Sekunde schon ganz toll. Ich habe mich bisher noch nicht mit sqlite im Zusammenhang mit vb.net befasst. Werde ich wohl mal müssen.

    Danke für deine Antworten

    Team24Nord schrieb:

    Gibt es irgendein unterschied zwischen vbTab und ControlChars.Tab den ich kennen sollte oder ist es egal was ich nehme?

    Microsoft.VisualBasic.ControlChars

    Wenn du mit vbTab und Kram arbeitest, dann versäumst du wohl bislang, dich mittels Visual Studio - Empfohlene Einstellungen von der in vb.net mitgeschleppten vb6-KinderK... zu befreien.
    Das sollte man aber immer tun - genannte KK verhindert furchtbar erschreckend das Verständnis und Anwenden von OOP, und bewirkt bei glaub 50% der vb.net-Programmierern eine jämmerliche Qualität ihrer Codes.