Eu descobri:
O motivo é que gzipopera (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 gzipestava procurando como um louco.
Eu trabalhei em torno disso usando o bufferutilitá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:
-se -mdeve 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
ddfazer o mesmo?