
El procedimiento habitual que se sigue en un script perl para procesar información consiste en crear una serie de estructuras de datos para contener la información. Pero si el volumen de datos a procesar es muy elevado, los recursos de memoria RAM existentes en el ordenador en el que se ejecuta el script pueden ser insuficientes.
En este artículo se presentan distintas posibilidades para solucionar este problema.
Usar una base de datos para almacenar la información
Esta es la solución más directa. Una base de datos (MySQL, PostgreSQL,…) es una herramienta especializada en el manejo de grandes volúmenes de datos. En ella se pueden definir tablas, indices, procedimientos almacenados, etc. Para el almacenamiento y consulta de la información a procesar, de una manera eficiente y optimizando el uso de los recursos disponibles.
Usar un fichero con DBM::Deep
DBM::Deep permite asociar un fichero a una estructura hash. Al establecer la asociación, los datos que contiene el hash se almacenan en el fichero, en lugar de utilizar memoria RAM. De esta manera, es el propio sistema operativo el responsable de realizar las transferencias entre el disco y la memoria RAM.
Además, esta asociación puede ser completamente transparente, de manera que el hash se utiliza exactamente igual que un hash «normal» de perl.
Ejemplo 1 – Usar DBM::Deep para trabajar con una hashref
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/perl use strict; use warnings; use DBM::Deep; my $db = DBM::Deep->new( "datos.db" ); if (! defined $db->{"clave"}) { $db->{"clave"} = "valor"; } else { print "antiguo valor: " . $db->{"clave"} . "\n"; $db->{"clave"} = "nuevo valor"; } print $db->{clave} . "\n"; |
Al ejecutar por primera vez este script de ejemplo, se crea un fichero «datos.db» en el que se almacena el valor «valor» asociado a la clave «clave».
Al ejecutarse por segunda vez, el valor previamente asignado a «clave» es recuperado del fichero «datos.db», y el resultado es:
1 2 3 4 5 |
$ perl prueba_dbm_deep.pl antiguo valor: valor nuevo valor |
Ejemplo 2 – Usar DBM::Deep para trabajar con un array
1 2 3 4 5 6 7 8 9 10 |
my $granarray = DBM::Deep->new( file => "granarray.db", type => DBM::Deep->TYPE_ARRAY ); push(@$granarray, "uno"); push(@$granarray, [ "dos", "es un array" ] ); push(@$granarray, { "tres" => "es un hashref" } ); |
Como puede verse, la principal diferencia respecto del código utilizado para trabajar con un hash es la manera en que se le pasan argumentos al método new(). Para indicar a DBM:::Deep que queremos asociar el fichero a una array, pasamos un argumento «type» cuyo valor es la constante «DBM::Deep->TYPE_ARRAY».
Por lo demás, el array se utiliza en el script como un array «normal». En el ejemplo podemos ver que los elementos añadidos al array pueden ser también arrays y hashes, además de elementos escalares.
—
Referencias
—
Indice de artículos relacionados con la programación en lenguaje perl
—