Eu descobri:
A razão é que gzip
opera (em termos de velocidade de CPU versus velocidade de busca HD atualmente) tamanhos de buffer extremamente baixos .
Ele lê alguns KB a partir do arquivo de entrada, comprime-o e libera-o para o arquivo de saída. Dado o fato de que isso requer uma busca por disco rígido, apenas algumas operações podem ser feitas por segundos.
O motivo pelo qual o meu desempenho não foi dimensionado é porque já um gzip
estava procurando como um louco.
Eu trabalhei em torno disso usando o utilitário unix buffer
:
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Por armazenar em buffer muita entrada antes de enviá-la para o gzip, o número de pesquisas pequenas pode ser drasticamente reduzido. As opções:
-
-s
e-m
são para especificar o tamanho do buffer (acredito que ele esteja em KB, mas não tenho certeza) -
-p 100
certifica-se de que os dados só são passados para o gzip quando o buffer é 100% preenchido
Executando quatro deles em paralelo, consegui obter uma taxa de transferência de 4 * 25 MB / s, como esperado.
Eu ainda me pergunto por que o gzip não permite aumentar o tamanho do buffer - desta forma, é inútil se rodar em um disco giratório.
EDIT : experimentei mais alguns comportamentos de programas de compressão:
-
bzip2
processa apenas 2 MB / s devido à sua compactação mais strong / mais intensa da CPU -
lzop
parece permitir buffers maiores: 70 MB / s por núcleo, e 2 núcleos podem maximizar meu HD sem procurar demais