Suporte multithreaded em 7za

15

(Eu postei isso primeiro no serverfault, mas depois percebi que provavelmente pertence aqui.)

Estou tentando compactar um arquivo de texto muito grande usando 7za (p7zip) 9,20. A opção -mmt não parece ter nenhum efeito. Eu tentei tanto -mmt = on e -mmt = 2. Esta é uma máquina de 8 núcleos. Uma pessoa sugeriu adicionar -m0 = lzma2 como argumento, mas isso me dá E_INVALIDARG. Alguém sabe como fazer isso funcionar?

Isso não tem efeito:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

E isso falha com um erro:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG
    
por Brian L 07.06.2012 / 19:13

2 respostas

23

De acordo com -m (Definir compactação Método) switch # ZipMultiThread - manual 7ZIP & documentação , mt é padronizado para on , então não há necessidade de especificá-lo.

No entanto, a implementação do 7zip do algoritmo DEFLATE não suporta multi-threading!

Como você já descobriu,

7za a archive.zip bigfile

usa apenas um núcleo.

Mas os arquivos .zip compactam todos os arquivos individualmente. Ao compactar vários arquivos , a opção multi-threading compacta um arquivo por núcleo de uma só vez.

Experimente e você verá que

7za a archive.zip bigfile1 ... bigfileN

usará todos os N núcleos disponíveis.

Se você quiser acelerar a compactação de um arquivo único , terá duas opções:

  1. Divida bigfile em blocos.

  2. Use um algoritmo de compactação diferente.

    Por exemplo, a implementação do 7zip do algoritmo BZip2 suporta multi-threading.

    A sintaxe é:

    7za a -mm=BZip2 archive.zip bigfile
    

Além disso, o erro de sintaxe é causado por sua tentativa de usar o Algoritmo LZM para um contêiner .zip . Isso não é possível.

Os algoritmos possíveis para .zip conatiners são DEFLATE (64), BZip2 e sem compressão.

Se você quiser usar o Algoritmo LZM, use um contêiner .7z . Esse contêiner também lida com os seguintes algoritmos: PPMd, BZip2, DEFLATE, BCJ, BCJ2 e sem compactação.

    
por 07.06.2012 / 19:41
5

Essa é uma pergunta antiga, e não a resposta para a pergunta específica, mas uma resposta ao espírito da pergunta (Usando todos os núcleos para compactar um formato zip)

pigz (gzip paralelo com opção .zip)

pigz -K -k archive.zip bigfile txt

Isso fornecerá a você um arquivo compatível com zip 7x mais rápido para o mesmo nível de compactação.

Uma comparação rápida de compressores zip compatíveis e não zip usando um ou vários núcleos.

tempos de parede no i7-2600k para comprimir o arquivo txt de 1.0gb no fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

tempos de parede para descomprimir

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
    
por 30.04.2014 / 22:56