ATTENZIONE: Questo script avvia una shell per blocco, per file molto grandi, potrebbe essere centinaia.
Ecco uno script che ho scritto per questo scopo. Su una macchina a 4 processori ha migliorato le prestazioni di ordinamento del 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
Consulta anche: "Sorting large files faster with a shell script"
Modificato di nuovo il comando. UUoC. ;) – ayaz
Questo è interessante. Non so davvero come funziona, ma ho una supposizione. Probabilmente mette il primo carattere di ogni chiave in un albero binario, e quando c'è una collisione, usa anche il prossimo carattere della chiave, quindi non salva più la chiave del necessario.Può quindi salvare un offset nel file con ciascun tasto in modo che possa cercare e stampare ogni riga in ordine. – Zifre
In realtà, @ayaz è più interessante se non si ordina un file su disco ma piuttosto in una pipe poiché è ovvio che non è possibile eseguire più passaggi sui dati di input. – tvanfosson