Al analizar datos genómicos a menudo tenemos que manejar ficheros de texto enormes, del orden de decenas de GB, que suelen estar comprimidos para no llenar el disco.
Imagen de https://the-chestnut.com |
Por ejemplo:
-rw-r--r-- 1 contrera contrera 2.2G Feb 23 12:43 mergedpairs.tsv
comprimido con gzip ocupa casi la décima parte:
-rw-r--r-- 1 contrera contrera 255M Feb 23 12:43 mergedpairs.tsv.gz
A veces es necesario operar sobre este tipo de ficheros desde scripts o el terminal sin descomprimirlos en el disco. Por ejemplo, podemos contar el número de líneas con zcat:
time zcat mergedpairs.tsv.gz | wc -l
10205212
real 0m10.793s
user 0m10.689s
sys 0m1.726s
Otra opción un poco más rápida, qué descubrí en dos foros (1,2), es unpigz, que hay que instalar primero en Ubuntu:
sudo apt install pigz
time unpigz -dc mergedpairs.tsv.gz | wc -l
10205212
real 0m6.503s
user 0m10.742s
sys 0m3.391s
Otra opción que he encontrado es https://github.com/mxmlnkn/rapidgzip, que además tiene una interfaz python que permite indexar ficheros .gz, pero se puede usar en la línea de comando también:
python3 -m pip install rapidgzip
time rapidgzip -d -c -P 0 mergedpairs.tsv.gz | wc -l
10205212
real 0m2.833s
user 0m10.895s
sys 0m5.020s
Finalmente, he probado con https://github.com/facebook/zstd, que usa un formato de compresión menos estándar (.zst):
sudo apt install zstd
pzstd mergedpairs.tsv
time pzstd -d -c mergedpairs.tsv.zst | wc -l
mergedpairs.tsv.zst : 2273983394 bytes
10205212
real 0m1.600s
user 0m5.973s
sys 0m3.348s
Hasta pronto,
Bruno