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.

Como usar "sort" em arquivos muito grandes

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.

Um exemplo inicial

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.

Controlando o uso da memória com "-S"

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.

Escolhendo o diretório temporário com "-T"

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.

Usando vários processadores

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.

Comprimindo os arquivos temporários

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 influência da localidade

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.

Uma configuração completa

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.

Acompanhando a execuçã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.

Comparando configurações

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.

Conclusão

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.



Veja a relação completa dos artigos de Rubens Queiroz de Almeida