Eu descobri:
O motivo é que gzip
opera (em termos de velocidade da CPU versus velocidade de busca HD hoje em dia) tamanhos de buffer extremamente baixos .
Ele lê alguns KB do arquivo de entrada, o compacta e libera para o arquivo de saída. Dado que isso requer uma busca no disco rígido, apenas algumas operações podem ser realizadas por segundo.
A razão pela qual meu desempenho não foi dimensionado é porque já se gzip
estava procurando como um louco.
Eu trabalhei em torno disso usando o buffer
utilitário unix :
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Armazenando em buffer muita entrada antes de enviá-la para o gzip, o número de pequenas buscas pode ser reduzido drasticamente. As opções:
-s
e -m
deve especificar o tamanho do buffer ( acredito que seja em KB, mas não tenho certeza)
-p 100
garante que os dados sejam passados para o gzip apenas quando o buffer estiver 100% preenchido
Executando quatro deles em paralelo, eu poderia obter uma taxa de transferência de 4 * 25 MB / s, conforme o esperado.
Ainda me pergunto por que o gzip não permite aumentar o tamanho do buffer - dessa forma, é bastante inútil se for executado em um disco giratório.
EDIT : Tentei mais alguns comportamentos de programas de compactação:
bzip2
processa apenas 2 MB / s devido à sua compressão mais forte / intensiva da CPU
lzop
parece permitir buffers maiores: 70 MB / s por núcleo e 2 núcleos podem maximizar meu HD sem procurar demais
dd
fazer o mesmo?