Eu tenho um monte de arquivos gzip que tenho que converter para bzip2 de vez em quando. Atualmente, estou usando um script de shell que simplesmente 'gunzip' é cada arquivo e depois 'bzip2' é. Embora isso funcione, leva muito tempo para ser concluído.
É possível tornar esse processo mais eficiente? Estou pronto para mergulhar e analisar os códigos-fonte do gunzip e do bzip2, se necessário, mas só quero ter certeza do pagamento. Existe alguma esperança de melhorar a eficiência do processo?
fonte
pbzip2
menção. Caso o link não seja carregado para mais ninguém, aqui está a página do projeto e a página do manual .Em vez de fazer o gunzip em uma etapa e o bzip2 em outra, pergunto-me se talvez fosse mais eficiente usar tubos. Algo como
gunzip --to-stdout foo.gz | bzip2 > foo.bz2
Estou pensando com duas ou mais CPUs, isso definitivamente seria mais rápido. Mas talvez até com apenas um núcleo. Eu vergonhosamente admito que não tentei isso, no entanto.
fonte
bzip2
egzip
não funcionam em paralelo internamente, por meio de um tubo que você pode tê-los trabalho em paralelo, porque um tubo começa implicitamente dois processos, que vai correr em paralelo. Portanto, pelo menos descompactação e compactação serão executadas em paralelo.bzip2
o uso da CPUgunzip
é menor do que o anterior ; portanto, na prática, o paralelismo que você obtém aqui é mínimo. Não ter que fazer E / S de disco ainda é bom!O paralelo GNU ( http://www.gnu.org/software/parallel ) pode ser uma opção se você tiver vários núcleos (ou até várias máquinas):
Leia a página tutorial / man para obter detalhes e opções.
fonte
O que você está fazendo atualmente é sua melhor aposta. Não existe uma ferramenta de conversão disponível, e tentar compactar com bzip2 um arquivo já compactado não é realmente uma opção, pois geralmente produz efeitos indesejados. Como o algoritmo é diferente, a conversão envolveria a recuperação dos dados originais, independentemente. A menos, é claro, que o gzipping tenha sido um passo no processo do bzip2, no qual infelizmente não é.
fonte
gzip
usa Leimpel-Ziv 77, enquantobzip2
usa Burrows-Wheeler. Algoritmos diferentes, receio.Ocasionalmente, preciso fazer o mesmo com arquivos de log. Começo com os menores arquivos * .gz primeiro (
ls -rS
), gunzip e depois os bzip2 individualmente. Não sei se é possível direcionar a saída do gunzip diretamente para a entrada bzip2. O comando bzip2 é muito mais lento na compactação do que o gunzip está na descompressão que pode consumir a memória e trocar espaço no host.Melhorias ou sugestões são bem-vindas. Aqui está o meu forro:
fonte
Se você tiver mais do que alguns, consulte o artigo do LJ com um bom script de shell.
http://linuxgazette.net/123/bechtel.html
O 7zip obtém uma melhor compactação e é multiencadeado.
fonte
Só tive que fazer isso alguns minutos atrás:
Onde
rezip
seria definido como:Opcionalmente, você também pode torná-lo multiencadeado usando uma
-P
opção comxargs
, mas tenha cuidado com ela. (Comece baixo!)fonte