Respostas:
A partir do coreutils 8.6 (15/10/2010), o GNU sort
já classifica em paralelo para fazer uso de vários processadores, quando disponíveis. Então, ele não pode ser melhorada a esse respeito como pigz
oupbzip2
melhorar gzip
ou bzip2
.
Se o seu sort
não for paralelo, você pode tentar instalar o GNUsort
partir da versão mais recente do coreutils do GNU .
Com a classificação GNU, você pode limitar o número de threads com a --parallel
opção
Se o seu arquivo for grande o suficiente, a classificação causará a troca de disco, porque a memória virtual alocada está ficando muito grande ou porque o sort
próprio programa está trocando pedaços para o disco e vice-versa. Mais velhosort
É mais provável que implementações mais tenham esse tipo de comportamento "classificar via buffer de disco", pois era a única maneira de classificar arquivos grandes nos velhos tempos.
sort
tem um -m
opção que pode ajudá-lo aqui. Pode ser mais rápido dividir o arquivo em pedaços - digamos split -l
- ordená-los independentemente e depois juntá-los novamente.
Por outro lado, pode ser que seja exatamente isso que "classificar via buffer de disco" faz. A única maneira de descobrir se isso ajuda é compará-lo com sua carga de teste específica. O parâmetro crítico será a contagem de linhas que você fornecer split -l
.
split
e merge
ver se isso ajuda.
merge(1)
tenha aplicabilidade aqui. Use sort -m
.
sort --merge
.
Eu tive um ganho muito significativo usando sort -n
, o que requer valores numéricos (float ou número inteiro) em todas as colunas selecionadas, sem notação científica.
Outra possibilidade que pode trazer uma grande melhoria em seu processo é usar a pasta mapeada na memória /dev/shm
para lidar com arquivos intermediários.
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null
Geralmente, a classificação do Linux faz algumas coisas bacanas para cumprir as regras de igualdade Unicode ... se você alterar o código do idioma para C, ele muda para somente byte ...
Para um arquivo de 1,4 GB, a diferença na minha máquina é 20s vs. 400s (!!!)
LC_ALL=C
seria suficiente?
LC_COLLATE
já seja suficiente. AFAIK sort
usos strcoll
para comparação e a página do manual diz que o comportamento dependeLC_COLLATE
#! /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
o arquivo é dividido e classificado, aumentará a velocidade da classificação