Posso paralelizar o tipo?

13

Por exemplo, para bzip pbzip , uma versão paralela de bzip . Existe alguma dessas ferramentas de paralelização para sort melhorar o desempenho?

    
por miku 29.08.2013 / 08:38

6 respostas

12

A partir do coreutils 8.6 (2010-10-15), o GNU sort já classifica em paralelo para fazer uso de vários processadores, quando disponíveis. Portanto, não é possível melhorar ainda mais nesse sentido, como pigz ou pbzip2 improve gzip ou bzip2 .

Se o seu sort não for paralelo, você pode tentar instalar o GNU sort da versão mais recente do GNU coreutils .

Com a classificação GNU, você pode limitar o número de segmentos com a opção --parallel .

    
por 29.08.2013 / 16:05
8

A única coisa que sempre me ajuda mais com o sort é dar o máximo de memória possível, de modo a reduzir a troca, por exemplo:

sort -S 20G
    
por 22.06.2015 / 22:19
6

Se o 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 próprio programa sort está trocando trechos para disco e vice-versa. Implementações sort mais antigas são mais propensas a ter esse tipo de comportamento "classificar via buffer de disco", já que era a única maneira de classificar arquivos grandes nos velhos tempos.

sort tem uma opção -m que pode ajudá-lo aqui. Pode ser mais rápido dividir o arquivo em partes - digamos, com split -l - classificá-las independentemente e, em seguida, mesclá-las novamente.

Então, novamente, pode ser que seja exatamente isso que "sort via buffer de disco" faz. A única maneira de descobrir se ajuda é fazer o benchmark em sua carga de teste específica. O parâmetro crítico será a contagem de linha que você dá para split -l .

    
por 29.08.2013 / 08:51
3

Eu tive um ganho muito significativo usando sort -n , que requer valores numéricos (float ou integer) 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 em memória /dev/shm para lidar com arquivos intermediários.

    
por 25.02.2015 / 19:42
3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Usualmente, o Linux classifica algumas coisas interessantes para obedecer às regras de igualdade do Unicode ... se você alterar o código do idioma para C, ele mudará para o byte somente ...

Para um arquivo de 1,4GB, a diferença na minha máquina é de 20s vs. 400s (!!!)

    
por 02.07.2015 / 02:53
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 ordenado, aumentará a velocidade de classificação

    
por 14.12.2015 / 14:02