Der beste Weg, um eine Kopfzeile beim Einlesen aus einer Textdatei in Perl zu überspringen?

8

Ich nehme ein paar Spalten aus einer tabellierten Datei in Perl. Die erste Zeile der Datei unterscheidet sich vollständig von den anderen Zeilen, daher möchte ich diese Zeile so schnell und effizient wie möglich überspringen.

Das habe ich bisher.

%Vor%

Gibt es einen besseren Weg, vielleicht ohne $ firstLine? ODER gibt es eine Möglichkeit, INFILE direkt aus Zeile 2 zu lesen?

Vielen Dank im Voraus!

    
New2Perl 18.01.2013, 06:05
quelle

6 Antworten

27

Lass uns ein paar Daten dazu bekommen. Ich bewertete alle Techniken ...

%Vor%

Da dies E / A ist, die von Kräften beeinflusst werden können, die außerhalb der Fähigkeit von Benchmark.pm liegen, habe ich sie mehrmals ausgeführt und überprüft, dass ich die gleichen Ergebnisse erzielt habe.

/usr/share/dict/words ist eine 2,4-Meg-Datei mit etwa 240.000 sehr kurzen Zeilen. Da wir die Zeilen nicht verarbeiten, sollte die Zeilenlänge keine Rolle spielen.

Ich habe in jeder Routine nur eine kleine Menge Arbeit geleistet, um den Unterschied zwischen den Techniken zu betonen. Ich wollte einige arbeiten, um eine realistische Obergrenze für die Leistung, die Sie gewinnen oder verlieren werden, zu erzielen, indem Sie das Lesen von Dateien ändern.

Ich habe das auf einem Laptop mit einer SSD gemacht, aber es ist immer noch ein Laptop. Wenn die E / A-Geschwindigkeit zunimmt, wird die CPU-Zeit wichtiger. Die Technik ist noch wichtiger auf einer Maschine mit schnellen I / O.

Hier ist, wie oft jede Routine die Datei pro Sekunde liest.

%Vor%

Ich bin schockiert, dass my @array = <$fh> mit großem Abstand am langsamsten ist. Ich hätte gedacht, es wäre am schnellsten, wenn die ganze Arbeit im Perl-Interpreter stattfindet. Es ist jedoch die einzige, die Speicher reserviert, um alle Zeilen zu halten, und das wahrscheinlich für die Leistungsverzögerung verantwortlich ist.

Die Verwendung von $. ist eine weitere Überraschung. Vielleicht kostet das den Zugriff auf ein magisches globales oder vielleicht einen numerischen Vergleich.

Und wie durch die algorithmische Analyse vorhergesagt, ist das Setzen des Header-Prüfcodes außerhalb der Schleife am schnellsten. Aber nicht viel. Wahrscheinlich nicht genug, um sich Sorgen zu machen, wenn Sie die nächsten zwei schnellsten verwenden.

    
Schwern 18.01.2013, 20:33
quelle
19

Sie können ihm zum ersten Mal eine Dummy-Variable zuweisen:

%Vor%     
Guru 18.01.2013 06:12
quelle
7

Ich verwende immer $. (aktuelle Zeilennummer), um dies zu erreichen:

%Vor%     
flesk 18.01.2013 09:13
quelle
2

Sie können eine Datei in einem Datei-Handle lesen und dann entweder array oder while-Schleife verwenden, um über Zeilen zu iterieren. Für die While-Schleife hat @Guru die Lösung für Sie. Für Array wäre es wie folgt:

%Vor%     
slayedbylucifer 18.01.2013 06:46
quelle
0

Ihr Code wäre wahrscheinlich in dieser Form eleganter:

%Vor%

Aber es ist immer noch in Ordnung. @ Gurus Antwort ist besser in Bezug auf die CPU-Zyklen, aber I / O verbraucht in der Regel Größenordnungen mehr von ihnen als ein einziges if.

    
Dallaylaen 18.01.2013 10:25
quelle
0

Ich hatte eine ähnliche Frage / ein ähnliches Problem. Meine Lösung war die folgende - für entpackte oder gezippte Dateien:

%Vor%

Ich weiß nichts über Benchmarking, aber es funktioniert gut für mich.

Am besten,

Sander

    
Sander W. van der Laan 04.05.2017 21:43
quelle