linux-l: perl und schnelle Suche

Oliver Bandel oliver at first.in-berlin.de
Mo Jun 18 00:20:09 CEST 2001


Hallo!

Leider schreibst Du immer nur von "datei", obwohl
es sich nun vermutlich um mehrere handelt.


On Sun, 17 Jun 2001, Ulrich Wiederhold wrote:

> Hallo,
> * Oliver Bandel <oliver at first.in-berlin.de> [010617 21:57]:
> > Ich dachte, es geht darum, einen String in einer
> > Datei ausfindig zu machen.
> 
> Exakt. Konkretes Beispiel ist:
> Ich habe eine Datei in der alle meine mp3-songs stehen, also z.B.
> Miles_Davis_filenaMe_1
> Miles Davis filename 2
> MiLes_Davis FilEname 3

Das heißt, Du hast eine Index-Datei, in der die
namen von Audiodateien drin stehen, die bestimmten
namen von Interpreten zugeordnet sind?

> 
> Wenn jetzt jemand nach Davis oder Miles oder Miles Davis oder
> Miles_DaVis sucht, sollen alle 3 files als Ergebnis ausgegeben werden.

Also Du meinst die Namen von drei Files, wobei die Dateinamen
der Audiudateien in dem indexfile liegen?

> 
> Wenn jemand nach filename 2 oder filenAME_2 sucht, soll nur "Miles Davis
> filename 2" ausgegeben werden.
> 
> Noch besser wäre es, wenn bei "Miles*filename 2" nur Zeile 2 augegeben
> würde.
> 
> > Wozu oder was willst du denn im Hash ablegen?
> > Wenn der Match erfolgreich ist, dann ist der
> > String in der Datei vorhanden => Dann kann man
> > sich die jeweilige Zeile ausgeben, wie es halt
> > mit grep sonst auch gemacht wird.
> Yep.
> 
> > Warum denn erst alles in ein hash ballern
> > und später wieder ausgeben?
> > Und warum, wenn es zwischengespeichert werden soll,
> > nicht einfach in ein Array ablegen?
> > Ist schneller als ein hash.
> 
> Ich dachte immer, ein hash wäre in dem Fall schneller als ein Array!?
> Zumindestens bei linearer Suche, was anderes ist mir beim Array nicht
> eingefallen.
> Meine beste Lösung war bisher, mittels 'grep -e' direkt in der Datei zu
> suchen, also ohne Perl.

Wenn ich jetzt richtig verstehe, willst du die Indexdatei
einmal in's Perlscript einlesen und dann mehrmals
auslesen?
Du schreibst einen Server/Daemon?

Also in dem Falle wäre ein hash sicherlich gut geeignet.


Oder willst Du die Datei jedesmal wieder neu
durchsuchen, also jedesmal neu einlesen und
im hash ablegen und dann alles wieder ausgeben?

Da wäre ein hash quatsch, denn dann kannst du es
direkt ausgeben. Aber in dem falle wäre auch
grep völlig ok, und vermutlich sogar schneller
als die Perl-Lösung.

> 
> Problem ist in erster Linie die Performance, die bei >3 Anfragen pro
> Sekunde einfach zu schlecht wird (Suche in > 20000 files sollte möglich
> sein), wenn man in mehreren Channels mit >700 Leuten ist.

Es kommt immer drauf an, wie DeinScript denn benutzt
weren soll.

Wenn es dauerhaft im Speicher bleibt, dann klappt das
mit der Hash-Lösung.
Dann musst Du die Anfragen aber irgendwie in das
Script einpipen, oder anderweitig übergeben (z.B. mit Sockets).

Solange man nicht weiß, in welchen Kontext Dein Programm
laufen soll, kann man jedenfalls keine spezielle Lösung
den Vorzug geben.

Deswegen, weil ich dachte, Du willst einen grep-Ersatz in
Perl realisieren dachte ich auch an ein einfaches ausgeben
des matches auf STDOUT, statt vo der Ausgabe aus STDOUT erst
alles unnötig in ei hash zu schreiben.

Ist also eine Frage des Gesamt-Konzepts.

Ciao,
   Oliver



Mehr Informationen über die Mailingliste linux-l