Lesen einer bestimmten Zeile aus einer großen Datei in Perl

7

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.

    
gib 18.12.2011, 10:59
quelle

3 Antworten

16

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.

    
friedo 18.12.2011, 11:45
quelle
4

Werfen Sie einen Blick auf Tie :: File Kernmodul.

    
cirne100 18.12.2011 12:17
quelle
0

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.

    
Dan Dascalescu 05.11.2012 02:47
quelle

Tags und Links