De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 30 de agosto de 2026
O comando sort funciona muito bem com arquivos pequenos, mas também foi projetado para processar volumes de dados maiores do que a memória disponível. Isso é possível porque ele não precisa manter todo o arquivo na memória ao mesmo tempo.
Quando a entrada é muito grande, o sort divide os dados em blocos, ordena cada bloco separadamente, grava resultados temporários em disco e, por fim, mescla esses arquivos para produzir a saída definitiva. Esse processo recebe o nome de ordenação externa.
Embora funcione automaticamente, algumas opções permitem controlar o uso da memória, o local dos arquivos temporários, o paralelismo e a compressão. Uma configuração adequada pode reduzir consideravelmente o tempo necessário para ordenar arquivos com dezenas ou centenas de gigabytes.
Considere um arquivo chamado acessos.tsv, com campos separados por tabulação:
servidor03 1258 2026-08-10 servidor01 98754 2026-08-12 servidor02 4512 2026-08-11
Para ordenar pelo nome do servidor e depois numericamente pelo segundo campo:
$ LC_ALL=C sort \
-t$'\t' \
-k1,1 \
-k2,2n \
acessos.tsv \
-o acessos-ordenados.tsv
Em um arquivo pequeno, esse comando termina rapidamente. Em um arquivo com vários gigabytes, o sort provavelmente precisará criar arquivos temporários. Nesse caso, memória, espaço em disco e velocidade do armazenamento passam a influenciar o desempenho.
A opção -S, também disponível como --buffer-size, determina aproximadamente a quantidade de memória que o sort poderá utilizar em sua fase inicial.
Para reservar 2 GiB:
$ sort -S 2G arquivo-grande.txt
Também podemos usar uma porcentagem da memória disponível:
$ sort -S 40% arquivo-grande.txt
Um buffer maior permite ordenar blocos maiores e pode reduzir a quantidade de arquivos temporários. Entretanto, reservar memória demais pode pressionar o sistema, provocar uso de swap e deixar outros programas lentos.
Em um servidor compartilhado, é prudente começar com um valor moderado:
$ sort -S 25% arquivo-grande.txt
A melhor configuração depende da memória disponível, do tamanho do arquivo e da carga exercida por outros processos.
É importante observar que -S não funciona necessariamente como um limite absoluto para toda a memória consumida pelo processo. Ela controla principalmente o tamanho do buffer usado na ordenação.
Por padrão, o sort grava seus arquivos temporários no diretório definido por TMPDIR ou em um diretório temporário padrão do sistema. Isso pode ser um problema se a partição correspondente for pequena ou lenta.
Podemos escolher outro local com -T:
$ sort \
-T /dados/sort-tmp \
arquivo-grande.txt
O diretório precisa existir e ter espaço suficiente:
$ mkdir -p /dados/sort-tmp
Antes de iniciar a ordenação, verifique o espaço disponível:
$ df -h /dados/sort-tmp
Também é conveniente conferir os inodes:
$ df -i /dados/sort-tmp
Um sistema de arquivos pode possuir espaço em bytes e, ainda assim, não conseguir criar novos arquivos caso todos os inodes estejam ocupados.
O GNU sort permite informar mais de um diretório temporário:
$ sort \
-T /disco1/sort-tmp \
-T /disco2/sort-tmp \
arquivo-grande.txt
Se os diretórios estiverem em dispositivos físicos diferentes, essa configuração poderá distribuir parte da atividade de entrada e saída. Se estiverem apenas em partições do mesmo disco, o ganho pode ser pequeno ou inexistente.
A opção --parallel controla quantas tarefas de ordenação poderão ser executadas paralelamente:
$ sort \
--parallel=4 \
arquivo-grande.txt
Em um computador com oito núcleos, poderíamos experimentar:
$ sort \
--parallel=8 \
arquivo-grande.txt
O uso de mais tarefas paralelas não garante uma redução proporcional no tempo. O gargalo pode estar no disco, na quantidade de memória disponível ou na criação dos arquivos temporários.
Em um HD mecânico, aumentar excessivamente o paralelismo pode até piorar o desempenho, pois várias operações disputarão o acesso ao mesmo dispositivo. Em SSDs rápidos, o paralelismo tende a ser mais proveitoso.
O comando nproc informa quantas unidades de processamento estão disponíveis:
$ nproc
Esse número serve como referência inicial, embora a melhor configuração deva ser determinada por testes.
Quando o espaço em disco ou a velocidade de entrada e saída são fatores limitantes, podemos pedir ao sort que comprima os arquivos temporários:
$ sort \
--compress-program=gzip \
arquivo-grande.txt
Uma alternativa rápida é utilizar lz4, se estiver instalado:
$ sort \
--compress-program=lz4 \
arquivo-grande.txt
A compressão reduz o volume gravado no disco, mas aumenta o consumo de CPU. Ela costuma ser vantajosa quando os dados são altamente compactáveis e o armazenamento é relativamente lento. Em SSDs rápidos ou em computadores com processadores já sobrecarregados, a compressão pode aumentar o tempo total.
O programa selecionado precisa aceitar a opção -d, usada pelo sort para descompactar os arquivos temporários.
A localidade define regras de comparação de caracteres, acentos e letras maiúsculas ou minúsculas. Em arquivos técnicos, identificadores e registros de log, podemos usar:
$ LC_ALL=C sort arquivo-grande.txt
A localidade C utiliza uma comparação baseada nos valores dos bytes. Além de produzir resultados previsíveis entre diferentes sistemas, ela normalmente é mais rápida do que uma ordenação baseada em regras linguísticas complexas.
Entretanto, ela pode gerar uma sequência pouco natural para nomes e palavras acentuadas. Se o arquivo for destinado à leitura humana, a localidade adequada ao idioma pode ser mais importante do que o ganho de velocidade.
Para ordenar um arquivo TSV pelo primeiro campo textual e pelo segundo campo numérico, podemos combinar as principais opções:
$ LC_ALL=C sort \
--parallel=8 \
-S 40% \
-T /dados/sort-tmp \
-t$'\t' \
-k1,1 \
-k2,2n \
entrada.tsv \
-o saida.tsv
Nesse comando:
LC_ALL=C utiliza uma comparação previsível e geralmente mais rápida;
--parallel=8 permite até oito tarefas de ordenação;
-S 40% destina aproximadamente 40% da memória ao buffer;
-T escolhe o diretório dos arquivos temporários;
-t$'\t' define a tabulação como separador;
-k1,1 usa o primeiro campo como chave principal;
-k2,2n usa o segundo campo como chave numérica;
-o grava o resultado no arquivo indicado.
Antes de executar, confira o diretório temporário:
$ df -h /dados/sort-tmp
Uma ordenação externa pode precisar de uma quantidade considerável de armazenamento temporário. A necessidade exata dependerá do tamanho da entrada, do buffer e do uso ou não de compressão.
Enquanto o comando estiver trabalhando, podemos acompanhar o consumo de memória e CPU:
$ top
Ou, se estiver disponível:
$ htop
Para observar o espaço ocupado pelo diretório temporário:
$ watch -n 2 du -sh /dados/sort-tmp
Também podemos acompanhar a memória e a atividade de entrada e saída com:
$ vmstat 2
Essas informações ajudam a identificar se o gargalo está no processador, na memória ou no armazenamento.
A melhor configuração deve ser encontrada por meio de medições. Podemos usar time:
$ time LC_ALL=C sort \
-S 1G \
arquivo-grande.txt \
-o /dev/null
Depois, experimentar paralelismo:
$ time LC_ALL=C sort \
--parallel=4 \
-S 1G \
arquivo-grande.txt \
-o /dev/null
E comparar com um buffer maior:
$ time LC_ALL=C sort \
--parallel=4 \
-S 2G \
arquivo-grande.txt \
-o /dev/null
O destino /dev/null é útil quando queremos medir a ordenação sem conservar o resultado, embora a gravação em um arquivo real possa apresentar um comportamento diferente.
Execute cada teste mais de uma vez e considere o efeito do cache do sistema. Também é importante manter o computador sob condições semelhantes durante as medições.
O sort consegue processar arquivos muito maiores do que a memória disponível porque combina ordenação em memória, arquivos temporários e uma etapa final de mesclagem.
As opções mais importantes para grandes volumes são:
| Opção | Significado |
|---|---|
-S |
tamanho aproximado do buffer |
-T |
diretório dos arquivos temporários |
--parallel |
quantidade de tarefas paralelas |
--compress-program |
compressão dos arquivos temporários |
Uma configuração equilibrada deve considerar a memória livre, a velocidade do armazenamento, a quantidade de processadores e o espaço temporário disponível. Em muitos casos, a maior melhoria não vem de aumentar todas as opções, mas de descobrir qual recurso está limitando a operação e ajustar somente esse ponto.