¿Puedo paralelizar la ordenación?

13

Por ejemplo, para bziphay pbzip , una versión paralela de bzip. ¿Existe alguna herramienta de paralelización para sortmejorar el rendimiento?

miku
fuente

Respuestas:

12

A partir de coreutils 8.6 (2010-10-15), GNU sortya se ordena en paralelo para hacer uso de varios procesadores donde estén disponibles. Por lo tanto, no se puede mejorar aún más en ese sentido como pigzo pbzip2mejorar gzipo bzip2.

Si sortno es paralelo, puede intentar instalar GNU sortdesde la última versión de GNU coreutils .

Con GNU sort, puede limitar el número de subprocesos con la --parallelopción.

Stéphane Chazelas
fuente
2
sort --stable proporciona un aumento del rendimiento del 15%, al menos en mi carga de trabajo de prueba.
jrw32982 apoya a Monica el
8

Lo único que siempre me ayuda más con la clasificación es darle tanta memoria como sea posible, para reducir el intercambio, por ejemplo:

sort -S 20G
benroth
fuente
44
Gracias, este es un truco que también uso últimamente, solo dejen que la mitad use la RAM, si es necesario:sort -S 50%
miku
6

Si su archivo es lo suficientemente grande, la ordenación provocará el intercambio de discos, ya sea porque la memoria virtual asignada está creciendo demasiado o porque el sortprograma en sí está intercambiando fragmentos en el disco y viceversa. sortEs más probable que las implementaciones anteriores tengan este tipo de comportamiento de "ordenar a través del búfer de disco", ya que era la única forma de ordenar archivos grandes en los viejos tiempos.

sorttiene una -mopción que puede ayudarte aquí. Puede ser más rápido dividir el archivo en trozos, digamos con split -l, ordenarlos de forma independiente, luego fusionarlos nuevamente.

Por otra parte, puede ser que esto es exactamente lo que hace "ordenar a través del búfer de disco". La única forma de averiguar si ayuda es compararlo con su carga de prueba particular. El parámetro crítico será el recuento de líneas que le dé split -l.

Warren Young
fuente
Gracias por tu respuesta. Realizaré algunos puntos de referencia con splity mergey veré si ayuda.
miku
@miku: No veo que merge(1)tenga aplicabilidad aquí. Uso sort -m.
Warren Young
1
perdón por mi laxitud, quise decir sort --merge.
miku
1
Si divide el archivo y clasifica las piezas, aún tendrá que ordenar todo cuando lo vuelva a armar, ¿verdad? ¿Cómo será eso más rápido?
terdon
2
Esta es una variante del algoritmo de clasificación de fusión , uno de los métodos de clasificación más rápidos disponibles.
Warren Young
3

Tuve una ganancia muy significativa usando sort -n, que requiere valores numéricos (flotante o entero) en todas las columnas seleccionadas, sin notación científica.

Otra posibilidad que puede aportar una gran mejora en su proceso es utilizar la carpeta asignada de memoria /dev/shmpara tratar con archivos intermedios.

Saullo GP Castro
fuente
3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Usualmente, la ordenación de Linux hace algunas cosas ingeniosas para cumplir con las reglas de igualdad de Unicode ... si cambia la configuración regional a C, solo cambia a byte ...

Para un archivo de 1.4GB, la diferencia en mi máquina es 20s vs. 400s (!!!)

monte_
fuente
Gracias, pero ¿no LC_ALL=Csería suficiente?
miku
Creo que sí ... tal vez LC_COLLATEya sea suficiente. AFAIK sortutiliza strcollpara comparar y la página de manual dice que el comportamiento depende deLC_COLLATE
mt_
0
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000 
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

 #Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort -n -t , -k 1,1 $file > $file.sorted &
done
wait

#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort  -mn $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

el archivo se divide y ordena aumentará la velocidad de la clasificación

amicos
fuente
1
¡Hola! Esta respuesta podría mejorarse explicando lo que debe hacer, en lugar de ser solo un volcado de código (también, si se ha comparado para ser más rápido que el tipo GNU en alguna entrada, ¡sería interesante saberlo!).
dhag