Suporte multithread em 7za

Suporte multithread em 7za

(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 -mmt=on e -mmt=2. Esta é uma máquina de 8 núcleos. Uma pessoa sugeriu adicionar -m0=lzma2 como argumento, mas isso só 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

Responder1

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

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

Como você já descobriu,

7za a archive.zip bigfile

usa apenas um núcleo.

Mas .zipos arquivos compactam cada arquivo individualmente. Ao compactardiversosarquivos, a opção multithreading compacta um arquivo por núcleo de uma só vez.

Experimente e você verá isso

7za a archive.zip bigfile1 ... bigfileN

usará todos Nos núcleos disponíveis.

Se você quiser acelerar a compactação de umsolteiroarquivo, você tem duas opções:

  1. Divida bigfileem pedaços.

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

    Por exemplo, a implementação do algoritmo BZip2 pelo 7zip oferece suporte a multithreading.

    A sintaxe é:

    7za a -mm=BZip2 archive.zip bigfile
    

Além disso, o erro de sintaxe é causado pela sua tentativa de usar o algoritmo LZM para um .zipcontêiner. Isso não é possível.

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

Se você quiser 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.

Responder2

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

Comparações rápidas de compressores zip compatíveis e não zip usando núcleos únicos e múltiplos.

tempos de parede no i7-2600k para compactar arquivo txt de 1,0 GB 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

Responder3

Outra opção para obter compactação multifacetada no Linux é usar o que o Facebook usa,Zpadrão. No Ubuntu, você instala assim:

sudo apt install zstd

Compressão multithread super rápida:

tar cf - /folder/you/want/to/compress | zstdmt -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Você pode especificar os níveis de compactação de 1 a 19 (3 ​​é o padrão).

Compressão máxima (mais lenta):

tar cf - /folder/you/want/to/compress | zstdmt -19 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Compressão média (nível 10):

tar cf - /folder/you/want/to/compress | zstdmt -10 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Minha experiência geral é que a compactação Zstandard não é tão forte quanto o 7zip, mas é muito mais rápida e o zstdmtcomando tenta usar todos os núcleos.

Aliás, no Windows, o 7zip usa todos os processadores por padrão e estou muito desapontado que esse não seja o caso no Linux. Tem sido assim há vários anos, neste momento, e eu gostaria que o 7zip fosse multithread por padrão no Linux também.

Responder4

Basta usar -mmt[N+1]

Por exemplo: -mmt2 é para um thread, -mmt9 é para oito threads

informação relacionada