Hola,
en entradas pasadas, como
ésta de 2010, ya hemos hablado de cómo ordenar resultados tabulares de BLAST con
GNU sort. Entre tanto
sort ha ido evolucionando y las versiones actuales, por ejemplo la que viene instalada por ejemplo en Ubuntu 18, ahora permite distribuir el trabajo en varias hebras:
--parallel=N change the number of sorts run concurrently to N
Sin embargo, cuando queremos ordenar de manera global tablas numéricas distribuidas en varios ficheros internamente ordenados seguiremos usando una opción que ya teníamos en 2010:
-m, --merge merge already sorted files; do not sort
A pesar de ahorrarse ordenar los ficheros internamente, cuando el número de ficheros es grande esta tarea se vuelve muy lenta. En el ejemplo ordenamos
100 ficheros separados por tabuladores (TSV) por las columnas numéricas 1 y 11:
time sort -S500M -s -k1g -k11g -m ficheros*.sorted > all.sorted
real 20m15.793s
user 19m46.045s
sys 0m18.724s
La clave para mejorar es eliminar el uso de ficheros temporales, leyendo de los 100 ficheros a la vez:
time sort --batch-size=100 -S500M -s -k1g -k11g -m ficheros*.sorted > all.sorted
real 13m49.672s
user 13m29.370s
sys 0m9.972s
De esta manera cuesta aproximadamente un tercio menos, y como se ve en el último ejemplo no sirve de nada aumentar la memoria del proceso de 500MB a 5 GB. De la misma manera, en mis pruebas no merece la pena aumentar el números de hebras concurrentes:
time sort --batch-size=100 S5G -s -k1g -k11g -m ficheros*.sorted > all.sorted
real 14m9.339s
user 13m49.315s
sys 0m10.705s
Hasta luego,
Bruno