Eu tenho um PC com CPU Intel (R) Pentium (R) G640 a 2,80 GHz e 8 GB de RAM. Estou executando o Scientific Linux 6.5 nele com o sistema de arquivos EXT3.
Nessa configuração, qual é a maneira mais rápida de fazer um sort -u
arquivo de 200 gigabytes?
Devo dividir o arquivo em arquivos menores (menores que 8 GB) sort -u
, juntá-los e dividi-los novamente em um tamanho diferente, sort -u
novamente etc.? Ou existem scripts de classificação, programas que podem lidar com arquivos tão grandes com minha quantidade limitada de RAM?
/tmp
.parallel
Acho que você precisará do GNU para isso, em vez do moreutilsparallel
instalado por padrão em alguns sistemas.sort(1)
poderia ficar sem espaço/tmp
; Se assim for, você pode designar uma outra área para arquivos temporários com a variável de ambienteTMPDIR
, ou a bandeira-T=<tmpdir>
Respostas:
O GNU
sort
(que é o padrão na maioria dos sistemas Linux), tem uma--parallel
opção. Em http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Como sua CPU possui 2 núcleos, você pode:
É melhor especificar o número real de núcleos, pois pode parecer haver mais devido ao fato de o processador ter hiperencadeamento .
Você também pode experimentar
nice
influenciar a prioridade de planejamento do processador eionice
influenciar o planejamento de E / S. Você pode aumentar a prioridade em relação a outros processos como este, acho que isso não lhe dará grandes economias, pois geralmente são melhores para garantir que um processo em segundo plano não use muitos recursos. No entanto, você pode combiná-los com algo como:Observe também que, como Gilles comentou, o uso de um único comando de classificação GNU será mais rápido do que qualquer outro método de quebrar a classificação, pois o algoritmo já está otimizado para lidar com arquivos grandes. Qualquer outra coisa provavelmente apenas atrasará as coisas.
fonte
sort
diretamente é melhor do que qualquer outra coisa que você possa fazer. A classificação GNU foi projetada para lidar bem com arquivos muito maiores que a RAM.Usar o
sort
comando provavelmente será a opção mais rápida.Mas você provavelmente desejará corrigir o código do idioma para C.
sort -u
não relata linhas exclusivas, mas uma de cada conjunto de linhas que são iguais. No código C, duas linhas diferentes não necessariamente são iguais, mas esse não é o caso na maioria dos locais baseados em UTF-8 nos sistemas GNU.Além disso, o uso da localidade C evita a sobrecarga de analisar o UTF-8 e o processamento de ordens de classificação complexas, melhorando drasticamente o desempenho.
Tão:
Você também pode melhorar o desempenho usando uma unidade mais rápida (ou diferente da onde estão os arquivos de entrada e / ou saída) para os arquivos temporários (usando
-T
ou$TMPDIR
variável de ambiente) ou mexendo na-S
opção suportada por algumassort
implementações) .Para algum tipo de entrada ou armazenamento lento, o uso da
--compress-program
opção GNUsort
(por exemplo, comlzop
) pode melhorar o desempenho, além do uso do armazenamento.fonte
Aqui está um script bash pronto para usar para classificar dados da escala de TB em uma máquina comum com dois GB de RAM: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Ele verifica o número de núcleos de sua máquina e usa todos os núcleos. Pode classificar arquivos numéricos ou de sequência. Pode ser usado para encontrar registros exclusivos nos dados da escala de TB.
fonte