Gibt es eine schnelle und speichereffiziente Möglichkeit, bestimmte Zeilen einer großen Datei zu lesen, ohne sie in den Speicher zu laden?
Ich habe ein Perl-Skript geschrieben, das viele Forks ausführt und ich möchte, dass sie bestimmte Zeilen aus einer Datei lesen.
Im Moment benutze ich einen externen Befehl:
%Vor%Es ist schnell und es funktioniert - aber vielleicht gibt es einen "Perl-ish" Weg, so schnell und so effizient wie dieser?
Wie Sie wissen, wird beim Erstellen eines Fork-Prozesses in Perl der Hauptprozessspeicher dupliziert. Wenn also der Hauptprozess 10 MB verwendet, verwendet der Fork mindestens so viel.
Mein Ziel ist es, den Fork-Prozess so weit wie möglich zu halten (also den Hauptprozess, bis auch die Forks laufen). Deshalb möchte ich nicht die ganze Datei in den Speicher laden.
Bevor Sie weiter gehen, ist es wichtig zu verstehen, wie fork
funktioniert. Wenn Sie fork
für einen Prozess verwenden, verwendet das Betriebssystem copy-on-write Semantik, um den Großteil davon zu teilen das Gedächtnis des Eltern- und Kindprozesses; nur die Menge an Speicher, die sich zwischen dem Elternteil und dem Kind unterscheidet, muss separat zugewiesen werden.
Um eine einzelne Zeile einer Datei in Perl zu lesen, hier ein einfacher Weg:
%Vor% Dies verwendet die spezielle Variable $.
, die die Zeilennummer des aktuellen Dateihandles enthält.
Sie müssen nicht verzweigen. Wie Sie sich vorstellen können, ist das Lesen einer bestimmten Zeile aus einer Datei eine übliche Operation, die eines der 20k-Module von CPAN bereits ausführt.
File :: ReadBackwards ist speichereffizient und schnell.