Posso paralelizar a classificação?

13

Por exemplo, bzippbzip , uma versão paralela de bzip. Existe alguma ferramenta de paralelização para sortmelhorar o desempenho?

miku
fonte

Respostas:

12

A partir do coreutils 8.6 (15/10/2010), o GNU sortjá 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 pigzoupbzip2 melhorar gzipou bzip2.

Se o seu sortnã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 --parallelopção

Stéphane Chazelas
fonte
2
sort --stable aumenta em 15% o desempenho, pelo menos na minha carga de trabalho de teste.
jrw32982 suporta Monica
8

A única coisa que sempre me ajuda mais na classificação é fornecer o máximo de memória possível, para reduzir a troca, por exemplo:

sort -S 20G
Benroth
fonte
4
Obrigado, este é um truque que eu uso ultimamente, também - basta deixar espécie usar metade da RAM, se necessário:sort -S 50%
miku
6

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 sortpró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.

Warren Young
fonte
Obrigado pela sua resposta. Vou realizar alguns benchmarks com splite mergever se isso ajuda.
Miku
@ Miku: Eu não vejo que merge(1)tenha aplicabilidade aqui. Use sort -m.
Warren Young
1
desculpe pela minha negligência, eu quis dizer sort --merge.
Miku
1
Se você dividir o arquivo e classificar as peças, ainda terá que classificar a coisa toda quando montar novamente, certo? Como isso será mais rápido?
terdon
2
Essa é uma variante do algoritmo de classificação por mesclagem , um dos métodos de classificação mais rápidos disponíveis.
Warren Young
3

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/shmpara lidar com arquivos intermediários.

Saullo GP Castro
fonte
3
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 (!!!)

mt_
fonte
Obrigado, mas não LC_ALL=Cseria suficiente?
Miku
Acho que sim ... talvez LC_COLLATEjá seja suficiente. AFAIK sortusos strcollpara comparação e a página do manual diz que o comportamento dependeLC_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

o arquivo é dividido e classificado, aumentará a velocidade da classificação

amicos
fonte
1
Oi! Essa resposta pode ser melhorada explicando o que ela deve fazer, em vez de ser apenas um despejo de código (também, se for comparado com o desempenho mais rápido do que o GNU em algumas entradas, seria interessante saber!).
dhag