tras la entrada 'Compresión de secuencias de ADN', que ya utilizaba el módulo estándar Compress::Zlib, en este ejemplo se muestra como leer línea a línea un archivo comprimido con los algoritmos de la librería zlib. En particular este ejemplo lee un archivo FASTA de gran tamaño sin necesidad de descomprimirlo entero. Lo he probado con éxito en Linux (con el intérprete Perl que viene instalado en Ubuntu 10.04) y también en Windows (con ActiveState Perl).
use strict;
use Compress::Zlib;
# http://perldoc.perl.org/Compress/Zlib.html
my $filename = '/path/to/swissprot.gz';
# ftp://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/
my $gz = gzopen($filename,'rb') ||
die "# Cannot open $filename: $gzerrno\n" ;
while($gz->gzreadline($_) > 0)
{
# haz algo con esta linea, guardada en $_, por ejemplo
# imprime los identificadores GenBank encontrados
if($_ =~ /^>/ && /(gi\|\d+)/){ print "$1\n" }
}
if($gzerrno != Z_STREAM_END)
{
die "# Error reading from $filename: $gzerrno\n"
}
$gz->gzclose();
Hasta pronto, Bruno
Buenas,
ResponderEliminartrabajando hoy con un .gz de 1.2GB descubro que el módulo PerlIO::gzip es mucho más rápido, incluso marginalmente más rápido que open(GZ,"zcat file.gz |"). Sin embargo, la manera más rápida que conozco hasta la fecha en una máquina multicore es open(GZ,"pigz -dc file.gz |"), que requiere la instalación del software pigz,
hasta luego,
Bruno