VB.NET - Datei Zeilenweise durchsuchen


mhribernik

Erfahrenes Mitglied
Hallo alle mit einand!

Ich stehe vor folgendem Problem:
In einem 2,8 GB großem Textfile stehen untereinander, zeilenweise, (wie in einer DB), verschiedene Datensätze. Die Zeilen werden über einen Schlüssel in Spalten geteilt.
(zB: ab Position 15 sind 20 Zeichen für die Spalte "Kundennummer" reserviert, ab Position 35 sind 10 Zeichen für die PLZ reserviert,.. usw.)

Nun möchte ich die Zeile eines bestimmten Kunden mit Hilfe seiner Kundennummer auslesen.
Bisher habe ich das wie folgt realisiert:
1) Zeilenweises einlesen der Datei
2) Jede gelesene Zeile wurde mit "Substring(*Gelesene_Zeile*, 15, 20 )" geprüft und wenn dies mit der Kundennr. übereinstimmte wurde die Zeile entsprechend weiterverarbeitet.

Dies funktioniert wegen der enormen Dateigröße leider nur sehr langsam.

Hat denn jemand von euch eine Idee zu einer schnelleren Lösung?
Ist es denn möglich immer nur die Zeichen 15 - 35 einer Zeile einzulesen?


Mit bestem Dank im Voraus für jeden Tipp!

Mfg. Marko
 

Shakie

Erfahrenes Mitglied
Wenn du genügend Arbeitsspeicher vorhanden hast, dann kannst du die Datei in eine geeignete Klasse laden (und somit in den RAM). Dann sollte das durchsuchen schneller gehen.

Falls du aber an eine bestimmte Zeile springen möchtest, zum Beispiel Zeile 1337, und jeder Datensatz die selbe Zeichenlänge hat, dann kannst du die Position innerhalb der Datei berechnen und über die Seek-Methode die Leseposition an diese Stelle setzen.
 

mhribernik

Erfahrenes Mitglied
Erstmal Danke für deine Antwort!

RAM:
Da das Programm auf einem Terminalserver ausgeführt werden soll ist der RAM wertvolle Ressource!.

Seek:
Die Zeilen haben alle die selbe Länge. Jedoch muss ich die richtige Zeile erst über die "Kundennummer" im gesamten Dokument suchen. Wenn ich drei verschiedene Zeilen heraussuchen muss dauert es schon einige Zeit. Und genau diese Zeit möchte ich minimieren.

MySQL:
Habe es nun mit einer MySQL Tabelle versucht; Beim Programmaufruf werden alle Kundennummer mit einem Verweis zur richtigen Zeilennummer gespeichert.

-> Jedoch sind die querys sehr langsam! Also kein vergleich zu zb.: PHP. Für 3000 Querys, die nur jeweils eine sechsstellige Zahl und eine Zeilennummer speichern benötigt das Programm ca. 15 - 20 Sekunden!

Ist das denn die normale Geschwindigkeit unter VB?


Mit bestem Dank im Voraus,
Marko
 

DrSoong

Iss was, Doc!
Teste mal, wie schnell das ganze läuft, wenn du alle Querys in einem einzigen String (die Querys werden ja mittels Semikolon getrennt) übergibst. Die Erzeugung des Strings selbst sollte schnell gehen (hab das ganze lokal mal mit 15000 SQLite-Querys gemacht, da hat das ganze gleich schnell gedauert, als wenn ich jedes Query einzeln übergeben hätte), hier würde dann die Geschwindigkeit der MySQL-Datenbank zum tragen kommen.


Der Doc!
 

Zvoni

Erfahrenes Mitglied
Ich hab mal was ähnliches machen müssen. Ich hab das so gelöst, dass ich parallel zu der Text-DB in einer zweiten Datei die Anzahl Datensätze gespeichert hatte, welche bei jeder Aktualisierung der Text-DB (Löschen bzw. Hinzufügen) mit der neuen Anzahl Datensätzen aktualisiert wurde. Weiterhin habe ich die Text-DB aufsteigend (in deinem Fall) nach Kundennummer sortiert abgespeichert. Dadurch konnte ich einen binären Suchalgorithmus verwenden, der mir meine Suchzeit um über 50% reduzieren konnte.

Vielleicht hilft dir das als Ansatz
 

Neue Beiträge

Forum-Statistiken

Themen
272.361
Beiträge
1.558.639
Mitglieder
187.834
Neuestes Mitglied
jordanx0206