Abbiamo un corpo maturo di codice che carica i dati da file in un database. Ci sono diversi formati di file; sono tutti campi a larghezza fissa.Come posso velocizzare l'elaborazione di dati a larghezza fissa di Perl?
Parte del codice utilizza la funzione Perl unpack()
per leggere i campi dai dati di input in variabili del pacchetto. La logica aziendale è quindi in grado di riferirsi a questi campi in un modo "leggibile".
Il codice di lettura file viene generato da una descrizione di formato una volta, prima di leggere un file.
Nella forma schizzo, il codice generato assomiglia a questo:
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;
}
Profiling il codice rivela che circa il 35% del tempo viene speso nella decomprimere e striscia leader-spazio. Il tempo rimanente è dedicato alla convalida e alla trasformazione dei dati e alla scrittura nel file di output.
Sembra che non ci sia una singola parte della business logic che richiede più dell'1-2% del tempo di esecuzione.
La domanda è: possiamo liberare un po 'più la velocità dal disimballaggio e dallo spogliamento dello spazio in qualche modo? Preferibilmente senza dover rifattorizzare tutto il codice che fa riferimento alle variabili del pacchetto FIELDS.
EDIT:
Nel caso in cui si fa la differenza
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1
Sarebbe interessante sapere se l'utilizzo di un elenco di variabili del pacchetto sul lato sinistro della scompattazione è probabile che sia ottimale. –