Escalabilidade de 'sort -u' para arquivos gigantescos

19

Qual é o limite de escalabilidade razoável de 'sort -u'? (em dimensões de "comprimento da linha", "quantidade de linhas", "tamanho total do arquivo"?)

Qual é a alternativa do Unix para arquivos que excedam isso na dimensão de "quantidade de linhas"? (É claro que posso implementar facilmente um, mas me perguntei se há algo que possa ser feito com alguns comandos padrão do Linux?)

    
por Grzegorz Wierzowiecki 26.04.2016 / 09:31

3 respostas

37

O sort que você encontra no Linux vem do pacote coreutils e implementa um mesclagem R-Way externa . Ele divide os dados em partes que ele pode manipular na memória, armazena-os no disco e os mescla. Os pedaços são feitos em paralelo, se a máquina tiver processadores para isso.

Portanto, se houver um limite, é o espaço livre em disco que o sort pode usar para armazenar os arquivos temporários que ele precisa mesclar, combinados com o resultado.

    
por 26.04.2016 / 09:37
1

Não posso falar de implementações específicas do fornecedor, mas a implementação UNIX sort divide arquivos grandes em arquivos menores, classifica esses arquivos e, em seguida, combina os arquivos menores classificados em uma saída classificada agregada.

A única limitação é o espaço em disco para os arquivos menores criados intermediadamente por sort , mas os arquivos podem ser redirecionados para um diretório arbitrário definindo a variável de ambiente TMPDIR .

    
por 26.04.2016 / 09:55
0

Com base no link e link :

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

Atualização:

A partir das respostas acima, vemos que sort já faz o que foi mencionado no snippet, ou seja, mesclagem externa de R-Way . Então, depois de tudo correndo apenas:

sort --parallel="$(nproc --all)" -u input > output

Deve ser suficiente.

Minhas suposições atuais (sem código de verificação) sobre limites são:

    O comprimento máximo da linha é limitado pela quantidade de memória física. Ordenar precisa encaixar pelo menos dois na memória
  • quantidade de linhas - não estou ciente de
  • tamanho do arquivo - claro, por sistema de arquivos
  • quantidade de arquivos abertos em paralelo - dependendo do sistema operacional (obrigado Diomidis Spinellis por apontar isso !)

(Esta resposta está marcada como wiki da comunidade - sinta-se encorajado a melhorá-lo! :))

    
por 13.04.2017 / 14:36

Tags