Thread Algorithmus für schnelles Indexieren von Dateien
(10 answers)
Opened by perlcharly at 2007-06-21 10:35
Hallo,
ich habe ein Script geschrieben, das aus HTML-Dateien den reinen ASCII-Text extrahiert und anschließend abspeichert, welche Wörter mit welchen Anfangsbuchstaben auf welcher Seite zu finden sind. Dazu werden 39 Index-Dateien verwendet, in denen jeweils nur Wörter mit einem Anfangsbuchstaben bzw. -zeichen ( 0-9, a-z, ä, ö, ü ) auftauchen, in jeder Zeile die Wörter einer Datei. Beispiel: In der Datei "d" findet sich dann etwa die Angabe: Seite 1: dach, debatte, denkpause, ... Seite 2: demenz, dieter, dortmund, durchschnitt, ... ..... Seite n: david, diagnose, ... Das Script läuft, es ist für meinen Geschmack nur recht zeitaufwändig, braucht auf einem Unix-Server knapp 3 Sekunden, um bei knapp 800 HTML-Dateien den HTML-Code zu entfernen, Stopwörter zu löschen usw. und dann alle Wörter aus den HTML-Seiten in den 39 Index-Seiten zu speichen. Ich hatte das Ganze ursprünglich mal mit 2 Hashes gelöst, also für jede HTML-Seite: - HTML-Code raus, Stopwörter raus, HTML-Sonderzeichen umwandeln in deutsche Umlaute usw. - Dann für jedes Wort den Anfangsbuchstaben ermitteln, und das Wort auf einen Hash packen - Wenn alle Wörter abgearbeitet sind, einen zweiten Hash verwenden, der als key ebenfalls Anfangsbuchstaben/-zahlen verwendet, aber die Wörter aller Dateien sammelt und auch die Datei festhält. Das Ganze dauerte aber sehr lange, ich glaube es waren 12 Sekunden. Ich habe jetzt eine Lösung, die schneller ist, aber immer noch für 800 Dateien mit ca. 3 MB 3 Sekunden braucht. Ich gehe Datei für Datei und Wort für Wort vor. Die Wörter kommen dann nacheinander in einen array. Ich simuliere dabei einen zweidimensionalen array, mit 39 Zeilen ( 0-9, a-z, ä, ö, ü ) und 800 Spalten (=Dateien). Das Wort "Anton" aus Datei Nr. 12 kommt in $array[8811], bzw. allgemeiner: $array[$position * $anzahl_dateien + $datei_nummer - 1] .= "$wort "; wobei $position die laufende Nummer (0 ... 38) für den Anfangsbuchstaben (0-9, a-z, ä, ö, ü) des Wortes ist. Das geht jetzt schon deutlich schneller, wie gesagt 3 Sekunden. Trotzdem die Frage: Mache ich das noch umständlich, weiß jemand einen schnelleren Perl-Algorithmus? PerlCharly\n\n <!--EDIT|perlcharly|1182408314--> |