Lesen einer bestimmten Zeile von großen Dateien in Perl
Gibt es keine schnelle und Speicher-effiziente Art und Weise zu Lesen, bestimmte Zeilen große Datei, ohne laden auf memory?
Schrieb ich ein perl-Skript, dass ausgeführt, viele Gabeln und ich möchte Sie zu Lesen, einzelne Zeilen aus einer Datei.
Im moment Im mit einer externen Befehl:
sub getFileLine {
my ( $filePath, $lineWanted ) = @_;
$SIG{PIPE} = '_IGNORE_';
open( my $fh, '-|:utf8', "tail -q -n +$lineWanted \"$filePath\" | head -n 1" );
my $line = <$fh>;
close $fh;
chomp( $line );
return $line;
}
Seine schnelle und es funktioniert - aber vielleicht gibt es eine "Perl-ish" Art und Weise, wie schnell und wie Speicher effizient wie dieses?
Wie Sie wissen, die Schaffung einer Gabel Prozess in Perl Duplikate der wichtigsten Prozess-Speicher - wenn also der Haupt-Prozess ist mit 10 MB, die Gabel verwenden, mindestens so viel.
Mein Ziel ist, halten Gabel Prozess (also Haupt-Prozess läuft bis Gabeln auch) memory-Nutzung so gering wie möglich. Das ist, warum ich nicht wollen, zu laden, die ganze Datei in den Speicher.
- btw, es ist
IGNORE
, nicht_IGNORE_
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bevor Sie gehen weiter, es ist wichtig zu verstehen, wie
fork
funktioniert. Wenn Siefork
ein Prozess, der OS verwendet copy-on-write Semantik zu teilen, der Großteil der Eltern-und Kind-Prozesse", Speicher; nur die Menge des Speichers, der unterscheidet sich zwischen Eltern und Kind müssen GESONDERT zugewiesen.Für das Lesen einer einzelnen Zeile von einer Datei in Perl, hier ist eine einfache Methode:
Dieser nutzt die besonderen
$.
variable enthält die Nummer der Zeile der aktuellen filehandle.Werfen Sie einen Blick auf Tie::File core-Modul.
Tie::File
war Speicher-ineffizient. Nicht die OP-Anfrage low-memory-Nutzung?Brauchen Sie nicht auf den Tisch. Wie Sie sich vorstellen können, das Lesen einer bestimmten Zeile aus einer Datei ist ein normaler Vorgang, dass einer der 20k-Module auf CPAN tut es bereits.
File::ReadBackwards ist Speicher-effizient und schnell.