Calocybe: Schnellere Suche?

Beitrag lesen

Tag Cruz!

Hallo hängt ihr auch die ganze Zeit im Internet?

Naja, schon ab und zu. *g* Aber was hat das mit der Frage zu tun?

Man kann ja z.B. eine Datei einfach öffnen und in einen String packen. Dann kann man ja diesen String durchsuchen $string =~ m/blabla/; und hoffen, daß man etwas findet. Dabei hat man allerdings einen ganzen Batzen reduntante Daten eingelesen...alles was nicht gefunden wird, ist eigentlich redundant.

"Redundant" bedeutet eigentlich, dass dieselben Daten mehrmals an verschiedenen Stellen vorkommen. Was Du meinst, ist schlicht und einfach "ueberfluessig".

Was ist, wenn man eine Datei schon während des Einlesens durchsucht?
Also..

open (FILE, "$file)
while (<FILE>) {

»»  if (/blabla/) {

close(FILE);
  exit;

»»  }

}

Ist das nicht schneller, da man sich die Einlesezeit nach der Fundstelle spart?
Oder ist es aus irgendeinem Grund doch langsamer?

Nun... Wenn Du eine Datei zeilenweise einliest, braucht der Perl-Interpreter (bzw. die darunterliegende C-Runtime library) etwas Zeit, um die Zeilenenden zu finden, Dir Deine Daten schoen zeilenweise zu liefern, bereits gelesene Daten irgendwo zu puffern. Daher sollte man, wenn eine gesamte Datei einlesen will, und den Inhalt nicht zeilenweise braucht, dies besser so tun (incl. der geschweiften Klammern):
{
    local $/;
    undef $/;
    $content = <FILE>;
}

Fuer Deinen Fall ist das ganze Datei einlesen aber in der Tat eher ungeeignet. Denn wenn Dein Suchbegriff z.B. in der Mitte steht (und durchschnittlich wird er das wohl), liest Du die Haelfte der Datei umsonst ein. Das braucht auch nen Haufen Zeit (und zwar wahrscheinlich mehr als fuer das Zeilenenden finden, da Plattenzugriff) und auch mehr Speicher (Du haeltst ja nur eine Zeile im Speicher, nicht die ganze Datei). Und die einzelnen Zeilen brauchst Du fuer Deinen Zweck wahrscheinlich sowieso. Daher wirst Du wohl mit dem zeilenweisen Einlesen besser beraten sein.

So long