Suporte multithread no 7za

18

(Publiquei isso primeiro em serverfault, mas depois percebi que provavelmente pertence aqui.)

Estou tentando compactar um arquivo de texto muito grande usando o 7za (p7zip) 9.20. A opção -mmt parece não ter nenhum efeito. Eu tentei ambos -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
Brian L
fonte
Eu acredito que a opção é simplesmente -mmt, não -mmt=2. Também acredito que a sintaxe adequada seja -mx9, embora ambas possam funcionar.
Breakthrough
Obrigado, mas -mmt sem uma opção ainda usa apenas um thread. De acordo com docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , você pode especificar o número de threads a serem usados ​​com -mmt = N.
Brian L
Eu ainda recomendaria o uso do LZMA / Deflate, mesmo que seja apenas de thread único. Embora você possa obter uma maior velocidade de compactação com o BZip2, é menos eficiente ao compactar texto sem formatação, e as variantes de thread único são mais lentas que os equivalentes LZMA / Deflate.
Breakthrough
@ Breakthrough: o BZip2 geralmente obtém uma melhor compactação do que o DEFLATE, conforme mostrado no seu link. Também é muito, muito mais rápido que o LZMA (ao comprimir).
217 Dennis

Respostas:

25

De acordo com a opção -m (Definir método de compactação), # ZipMultiThread - manual e documentação do 7ZIP , o mtpadrão é on, portanto, não há necessidade de especificá-lo.

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

Como você já descobriu,

7za a archive.zip bigfile

usa apenas um núcleo.

Mas os .ziparquivos compactam todos os arquivos individualmente. Ao compactar vários arquivos, a opção multiencadeamento comprime um arquivo por núcleo de uma vez.

Experimente e você verá isso

7za a archive.zip bigfile1 ... bigfileN

usará todos os Nnúcleos disponíveis .

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

  1. Dividir bigfileem pedaços.

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

    Por exemplo, a implementação do algoritmo BZip2 por 7zip 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 .zipcontêiner. Isso não é possível.

Os possíveis algoritmos para .zipconatinadores são DEFLATE (64), BZip2 e sem compactação.

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

Dennis
fonte
@ Dennis, pensei que o OP estava usando LZMA (2), que a partir da documentação "A compactação LZMA usa apenas 2 threads". Embora eu concorde, intuitivamente (devido à maneira a codificação Lempel-Ziv funciona), seria muito difícil multithread LZMA ou Deflate (que é apenas LZMA com codificação Huffman).
Breakthrough
1
@ Breakthrough: No começo, eu também. (Confira as revisões da minha resposta.) É sobre isso que se tratava o erro de sintaxe. Você não pode usar a compactação LZMA com um .zipcontêiner.
Dennis
@ Dennis ah, obrigado por esclarecer isso. Não viu que o OP estava usando um .ZIPcontêiner.
Inovação
Espere, para obter um resultado diferente se eu apenas alterar a extensão do arquivo do contêiner para .7z?
Brian L
3
@BrianL existe um botão "obrigado" embutido. Parece uma seta voltada para cima;)
nhinkle
5

Essa é uma pergunta antiga, e não a resposta para a pergunta específica, mas uma resposta para o 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á um arquivo compatível com zip 7x mais rápido para o mesmo nível de compactação.

Comparações rápidas de compressores compatíveis com e sem zip, usando um e vários núcleos.

tempos de parede no i7-2600k para compactar 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
tgeorge
fonte
por que pigz quando você pode pbzip2 ou pixz?
aceno
O gzip é muito, muito mais rápido que o bzip2, portanto a compactação extra nem sempre vale a pena.
jesjimher
0

Apenas use -mmt [N + 1]

Por exemplo: -mmt2 é para um encadeamento, -mmt9 é para oito encadeamentos

acubed
fonte
-1

Verificado e testado: Para usar o multithreading no 7za, o parâmetro deve ser "-mmt #" not "-mmt = #", colocando o sinal de igual faz com que seja ignorado.

Como eu descobri? Depois de executar o 7z sem nenhum parâmetro, ele mostra as informações sobre os parâmetros; nos comutadores, ele diz "-mmt [N]", não "-mmt = [N]"

Então, se eu entendi bem, o parâmetro que você está digitando "-mmt = 2" pode estar errado e pode ser "-mmt2", sem o sinal de igual.

Não sei se entendi bem, meu inglês é muito ruim.

A propósito, por que você usa "7za" em vez de apenas "7z"?

Então, para testar o parâmetro, eu executo um conjunto de comandos para fazer benchmarks e isso confirmou o erro de digitação em alguma documentação. O parâmetro correto deve ser digitado sem o sinal de igual.

Comando para fazer um benchmark com 7z com apenas um thread: 7z b -mmt1

Comando para fazer um benchmark com 7z com apenas dois threads: 7z b -mmt2

Comando para fazer um benchmark com o 7za com apenas dois threads: 7za b -mmt2

Comando para fazer um benchmark com o 7za com apenas um thread: 7za b -mmt1

Não há sinal de igual no parâmetro mm-mmt # ˋ, nem para 7z nem 7za.

Laura
fonte