Posso descompactar e mesclar arquivos de texto classificados em uma única operação?

4

Eu tenho dezenas de milhares de arquivos de texto gzipped, cada um dos quais já foi classificado internamente.

Eu escrevi um script para descompactá-los (criando uma cópia) e, em seguida, usando sort -m para mesclá-los.

Tudo funciona muito bem, mas ao tentar melhorar o desempenho, notei que a operação de descompactação é de cerca de 16-20% do tempo total de execução.

Basicamente, a operação de mesclagem deve examinar a maior parte dos arquivos de texto repetidamente, mesclando 16 arquivos em um por vez. Normalmente, isso leva a cerca de 4 a 5 exames completos por meio dos dados que tenho. O descompactador essencialmente adiciona uma varredura adicional em tudo.

Salvar 1 de 5 a 6 varreduras por meio de 50 a 100 GB de dados é uma economia substancial.

Assim, comecei a pensar se poderia alimentar a saída de gunzip diretamente em sort (ou alguma outra ferramenta) e basicamente combinar a rodada de descompactação com a primeira rodada de mesclagem. A saída não seria gzipped.

Alguém sabe se isso pode ser feito? Idealmente com as ferramentas padrão, mas também estou aberto a ferramentas de terceiros, se for adequado.

    
por Kris 11.06.2013 / 18:02

1 resposta

5

Você pode programar zcat (ou gzip -cd ) para gravar os dados descompactados no stdout. De lá, você pode usar a substituição de processos do bash. 1.gz é os números de 1 a 3; a.gz é as letras de a até c; e z.gz é o número 4 e a letra d:

$ sort -m <(zcat 1.gz) <(zcat a.gz) <(zcat z.gz)
1
2
3
4
a
b
c
d

Espero que seus dados sejam um pouco mais interessantes.

    
por 11.06.2013 / 18:49

Tags