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.705sHasta luego,
Bruno