Ich habe eine Multi-GB-Datei in Perl zu verarbeiten. Das zeilenweise Lesen der Datei dauert einige Minuten. das Lesen in einen Skalar über File :: Slurp dauert ein paar Sekunden. Gut. Nun, was ist der effizienteste Weg, um jede "Linie" des Skalars zu verarbeiten? Ich stelle mir vor, dass ich vermeiden sollte, den Skalar zu modifizieren, z. Entfernen Sie jede nachfolgende Zeile, während ich sie verarbeite, um eine Neuzuordnung des Skalars zu vermeiden.Datei :: Slurp in einen Multi-GB-Skalar - wie effizient zu teilen?
Ich habe versucht, diese:
use File::Slurp;
my $file_ref = read_file('/tmp/tom_timings/tom_timings_15998', scalar_ref => 1 ) ;
for my $line (split /\n/, $$file_ref) {
# process line
}
Und es ist Unter Minute: ausreichend, aber nicht so toll. Gibt es einen schnelleren Weg, dies zu tun? (Ich habe mehr Gedächtnis als Gott.)
'read_file' können Sie auch auf ein Array lesen:' meine @lines = READ_FILE ('Dateiname'); 'Natürlich, werden Sie noch müssen das gesamte Array durchlaufen, um jede Zeile zu verarbeiten, also ändert es nicht viel. – ThisSuitIsBlackNot
@ThisSuitIsBlackNot - Ich habe das versucht; es dauert lange. – Chap
Der Grund, warum es langsam ist, ist, dass es die Datei durchsuchen muss, um nach neuen Zeilen zu suchen. Wenn es sich um feste Breitenlinien handelt, können Sie in Bytes nach der Datei suchen, die schneller sein sollte. Wenn sie Linien mit variabler Länge sind, gibt es keinen wirklichen Weg um sie herum. – Oesor