ADVERTENCIA: Este script inicia un shell por fragmento, para archivos realmente grandes, podrían ser cientos.
Aquí hay un script que escribí para este propósito. ¡En una máquina de 4 procesadores, mejoró el rendimiento de clasificación en un 100%!
#! /bin/ksh
MAX_LINES_PER_CHUNK=1000000
ORIGINAL_FILE=$1
SORTED_FILE=$2
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted
usage()
{
echo Parallel sort
echo usage: psort file1 file2
echo Sorts text file file1 and stores the output in file2
echo Note: file1 will be split in chunks up to $MAX_LINES_PER_CHUNK lines
echo and each chunk will be sorted in parallel
}
# test if we have two arguments on the command line
if [ $# != 2 ]
then
usage
exit
fi
#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 $file > $file.sorted &
done
wait
#Merging chunks to $SORTED_FILE ...
sort -m $SORTED_CHUNK_FILES > $SORTED_FILE
#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
Consulte también: "Sorting large files faster with a shell script"
Editado el comando nuevamente. UUoC. ;) – ayaz
Esto es interesante. Realmente no sé cómo funciona, pero tengo una conjetura. Probablemente coloque el primer carácter de cada clave en un árbol binario, y cuando hay una colisión, también utiliza el siguiente carácter de la tecla, por lo que no guarda más de la clave de lo que necesita.Luego puede guardar una compensación en el archivo con cada tecla para que pueda buscar e imprimir cada línea en orden. – Zifre
En realidad, @ayaz es más interesante si no está ordenando un archivo en un disco sino más bien en un conducto, ya que hace obvio que no puede simplemente hacer múltiples pasadas sobre los datos de entrada. – tvanfosson