Obsługa wielowątkowości w 7za

18

(Opublikowałem ten pierwszy błąd serwera, ale potem zdałem sobie sprawę, że prawdopodobnie należy tutaj.)

Próbuję skompresować bardzo duży plik tekstowy przy użyciu 7za (p7zip) 9.20. Opcja -mmt nie wydaje się mieć żadnego efektu. Próbowałem zarówno -mmt = on, jak i -mmt = 2. To jest 8-rdzeniowa maszyna. Jedna osoba zasugerowała dodanie -m0 = lzma2 jako argumentu, ale to po prostu daje mi E_INVALIDARG. Czy ktoś wie, jak to zrobić?

To nie ma wpływu:

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

I to kończy się niepowodzeniem z błędem:

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.
źródło
Uważam, że opcja jest po prostu -mmtnieprawda -mmt=2. Uważam również, że właściwa składnia jest -mx9, chociaż oba mogą działać.
Przełom
Dzięki, ale -mmt bez opcji nadal używa tylko jednego wątku. Zgodnie z docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread można określić liczbę wątków, których należy użyć, -mmt = N.
Brian L,
Nadal zalecałbym użycie LZMA / Deflate, nawet jeśli jest to tylko jednowątkowy. Chociaż BZip2 może uzyskać zwiększoną prędkość kompresji, jest mniej wydajna podczas kompresji zwykłego tekstu, a warianty jednowątkowe są wolniejsze niż odpowiedniki LZMA / Deflate.
Przełom
@Breakthrough: BZip2 zwykle osiąga lepszą kompresję niż DEFLATE, jak pokazano w twoim linku. Jest także znacznie, dużo szybszy niż LZMA (podczas kompresji).
Dennis

Odpowiedzi:

25

Zgodnie z opcją -m (Ustaw metodę kompresji) przełącznik # ZipMultiThread - instrukcja i dokumentacja 7ZIP , mtdomyślnie ustawiona on, więc nie trzeba jej wcale określać.

Jednak implementacja algorytmu DEFLATE w 7zip nie obsługuje wielowątkowości!

Jak już odkryłeś,

7za a archive.zip bigfile

używa tylko jednego rdzenia.

Ale .zippliki kompresują każdy plik osobno. Podczas kompresji kilku plików opcja wielowątkowości kompresuje jeden plik na rdzeń jednocześnie.

Wypróbuj, a zobaczysz to

7za a archive.zip bigfile1 ... bigfileN

użyje wszystkich dostępnych Nrdzeni.

Jeśli chcesz przyspieszyć kompresję pojedynczego pliku, masz dwie możliwości:

  1. Podzielony bigfilena części.

  2. Użyj innego algorytmu kompresji.

    Na przykład implementacja algorytmu BZip2 przez 7zip obsługuje wielowątkowość.

    Składnia jest następująca:

    7za a -mm=BZip2 archive.zip bigfile
    

Błąd składniowy jest również spowodowany próbą użycia algorytmu LZM dla .zipkontenera. To nie jest możliwe.

Możliwe algorytmy dla .zipkonatynatorów to DEFLATE (64), BZip2 i brak kompresji.

Jeśli chcesz użyć algorytmu LZM, użyj .7zkontenera. Ten kontener obsługuje również następujące algorytmy: PPMd, BZip2, DEFLATE, BCJ, BCJ2 i bez kompresji.

Dennis
źródło
@ Dennis Myślałem, że OP używa LZMA (2), który z dokumentacji „Kompresja LZMA używa tylko 2 wątków”. Chociaż zgadzam się intuicyjnie (ze względu na sposób kodowania Lempel-Ziv ), bardzo trudno byłoby wielowątkowość LZMA lub Deflate (która jest po prostu LZMA z kodowaniem Huffmana).
Przełom
1
@Breakthrough: Na początku ja też. (Sprawdź wersje mojej odpowiedzi.) Na tym właśnie polegał błąd składniowy. Nie można używać kompresji LZMA z .zipkontenerem.
Dennis
@Dennis ah, dziękuję za wyjaśnienie. Nie widziałem, że OP używa .ZIPkontenera.
Przełom
Zaczekaj, więc uzyskam inny wynik, jeśli tylko zmienię rozszerzenie pliku kontenera na .7z?
Brian L,
3
@BrianL jest wbudowany przycisk „dzięki”. Wygląda jak strzałka skierowana w górę;)
nhinkle
5

To jest stare pytanie, a nie odpowiedź na konkretne pytanie, ale odpowiedź na ducha pytania (użycie wszystkich rdzeni do skompresowania formatu zip)

pigz (równoległy gzip z opcją .zip)

pigz -K -k archive.zip bigfile txt

Zapewni to 7-krotnie szybszy plik zgodny z formatem zip dla tego samego poziomu kompresji.

Szybkie porównanie kompresorów z zamkiem błyskawicznym i bez kompresora z użyciem pojedynczego i wielu rdzeni.

razy na ścianie w i7-2600k, aby skompresować plik TXT o pojemności 1,0 GB na Fedorze 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)

czasy ścian do dekompresji

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
tgeorge
źródło
po co Pigz, skoro można pbzip2 lub pixz?
skinął głową
gzip jest dużo, dużo szybszy niż bzip2, więc dodatkowa kompresja nie zawsze jest tego warta.
jesjimher
0

Wystarczy użyć -mmt [N + 1]

Na przykład: -mmt2 jest dla jednego wątku, -mmt9 jest dla ośmiu wątków

acubed
źródło
-1

Zweryfikowane i przetestowane: Aby korzystać z wielowątkowości na 7za, parametr musi mieć wartość „-mmt #” not ”-mmt = #”, umieszczenie znaku równości powoduje ignorowanie.

Jak odkryłem? Po uruchomieniu 7z bez żadnego parametru wyświetla informacje o parametrach, na przełącznikach mówi „-mmt [N]”, a nie „-mmt = [N]”

Więc jeśli dobrze rozumiem, parametr, który wpisujesz „-mmt = 2” może być źle zapisany i może być „-mmt2”, bez znaku równości.

Nie jestem pewien, czy dobrze rozumiem, mój angielski jest naprawdę słaby.

Nawiasem mówiąc, dlaczego używasz „7za” zamiast po prostu „7z”?

Aby przetestować parametr, uruchomiłem zestaw poleceń, aby wykonać testy porównawcze, co potwierdziło błąd literowy w dokumentacji. Prawidłowy parametr należy wpisać bez znaku równości.

Polecenie wykonania testu porównawczego z 7z z tylko jednym wątkiem: 7z b-mmt1

Polecenie wykonania testu porównawczego z 7z z tylko dwoma wątkami: 7z b-mmt2

Polecenie wykonania testu porównawczego z 7za z tylko dwoma wątkami: 7za b-mmt2

Polecenie wykonania testu porównawczego z 7za z tylko jednym wątkiem: 7za b -mmt1

Nie ma znaku równości w parametrze ˋ-mmt # ˋ, ani dla 7z, ani 7za.

Laura
źródło