Wir haben einen ausgereiften Code, der Daten aus Dateien in eine Datenbank lädt. Es gibt verschiedene Dateiformate; Sie sind alle Felder mit fester Breite.Wie kann ich Perls Verarbeitung von Daten mit fester Breite beschleunigen?
Ein Teil des Codes verwendet die Perl-Funktion unpack()
, um Felder aus den Eingabedaten in Paketvariablen zu lesen. Business-Logik ist dann in der Lage, auf diese Felder in einer "menschenlesbaren" Weise zu verweisen.
Der Dateilesecode wird vor dem Lesen einer Datei aus einer Formatbeschreibung generiert.
In skizzenhaft sucht der erzeugte Code wie folgt:
while (<>) {
# Start of generated code.
# Here we unpack 2 fields, real code does around 200.
($FIELDS::transaction_date, $FIELDS::customer_id) = unpack q{A8 A20};
# Some fields have leading space removed
# Generated code has one line like this per affected field.
$FIELDS::customer_id =~ s/^\s+//;
# End of generated code.
# Then we apply business logic to the data ...
if ($FIELDS::transaction_date eq $today) {
push @fields, q{something or other};
}
# Write to standard format for bulk load to the database.
print $fh join('|', @fields) . q{\n} or die;
}
den Code Profilierung ergibt, dass etwa 35% der Zeit in dem Entpack ausgegeben wird, und führt Raumstreifen. Die verbleibende Zeit wird für die Überprüfung und Umwandlung der Daten und das Schreiben in die Ausgabedatei aufgewendet.
Es scheint, dass es keinen einzelnen Teil der Geschäftslogik gibt, der mehr als 1-2% der Laufzeit beansprucht.
Die Frage ist - können wir etwas mehr Geschwindigkeit aus dem Auspacken und Weltraum-Strippen irgendwie herauskitzeln? Vorzugsweise ohne den ganzen Code umzuformen, der auf die FIELDS-Paketvariablen verweist.
EDIT:
Falls es einen Unterschied
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1
Wäre interessant zu wissen, ob die Verwendung einer Liste von Paketvariablen auf der linken Seite des Entpackens wahrscheinlich optimal ist. –