Jul 102014
 
Artículo Perl

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

#!/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:

$ perl prueba_dbm_deep.pl 
antiguo valor: valor
nuevo valor

Ejemplo 2 – Usar DBM::Deep para trabajar con un array

  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

 Publicado por en 12:10 pm

 Deja un comentario

(requerido)

(requerido)