Tenemos un cuerpo maduro de código que carga datos de archivos en una base de datos. Hay varios formatos de archivo; todos son campos de ancho fijo.¿Cómo puedo acelerar el procesamiento de Perl de datos de ancho fijo?
Parte del código utiliza la función Perl unpack()
para leer campos de los datos de entrada en variables de paquete. La lógica empresarial es capaz de referirse a estos campos de una manera 'legible por humanos'.
El código de lectura del archivo se genera a partir de una descripción de formato una vez, antes de leer un archivo.
En forma de bosquejo, el código generado se ve así:
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;
}
Perfilado el código revela que alrededor de 35% del tiempo que se gasta en el desempaquetado y tiras-espacio inicial. El tiempo restante se usa para validar y transformar los datos y para escribir en el archivo de salida.
Parece que no hay una sola parte de la lógica empresarial que tome más del 1-2% del tiempo de ejecución.
La pregunta es: ¿podemos obtener un poco más de velocidad del desembalaje y del espacio extraído de alguna manera? Preferiblemente sin tener que refactorizar todo el código que hace referencia a las variables del paquete FIELDS.
EDIT:
En caso de que se hace una diferencia
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1
Sería interesante saber si el uso de una lista de variables de paquete en el lado izquierdo del desempaquetado es probable que sea óptimo. –