Narzędzia do kompresji wielordzeniowej


61

Jakie narzędzia kompresji są dostępne w systemie Ubuntu, które mogą korzystać z wielordzeniowego procesora.


Dla przypomnienia alternatywą może być równoległe tworzenie niezależnych archiwów. Zamiast tworzyć plik myfiles.8core.xz, tworzysz plik myfiles1.xz do pliku myfiles8.xz równolegle. Będzie to wymagało agenta wysyłki. Oba podejścia mają komplementarne zalety i wady.
Acumenus

2
Próbowałem rozpakować plik 7 GB za pomocą bzip2, ale okazało się, że nie używa on wszystkich moich 8 rdzeni. Przeczytaj o tym i postanowiłem wypróbować pbzip2. Nadal działa tylko na jednym rdzeniu. Potem zauważyłem komentarze, że pbzip2 może tylko w pełni zrównoleglić dekompresję plików, które sam skompresował. Te same komentarze sugerują, że lbzip2 może w pełni zrównoleglać dowolny plik bz2, co rzeczywiście było prawdą - prawie w pełni wykorzystał (80-90% procesora) wszystkich moich rdzeni i rozpakował się znacznie szybciej.
Edi Bice,

Odpowiedzi:


34

Istnieją dwa główne narzędzia. lbzip2a pbzip2. Są to zasadniczo różne implementacje kompresorów bzip2. Porównałem je (wynik jest uporządkowaną wersją, ale powinieneś być w stanie uruchomić polecenia)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2wydaje się być zwycięzcą losowych danych. Jest nieco mniej skompresowany, ale znacznie szybszy. YMMV.


5
wygląda na brakującą cyfrę w rozmiarze pbzip2
Wayne Walker

4
/dev/urandomnie jest doskonałym wyborem danych wejściowych dla narzędzi do kompresji testów porównawczych, ponieważ dane losowe z definicji są nieściśliwe. To częściowo tłumaczy, dlaczego w obu przypadkach plik wyjściowy jest ~ 450 MB większy niż dane wejściowe.
ali_m

1
Przepraszam, jestem naprawdę pedantyczny, ale naprawdę przypadkowe dane mogą być super ściśliwe. Możesz poprosić o idealny RNG na 32 bity i zdobądź 00000000000000000000000000000000. Tak działa losowość;) Mówisz o średnich praktycznych. Jest mało prawdopodobne , że wygenerujesz plik 100 MB zawierający tylko zera. I zgadzam się z duchem tego, co mówisz, po prostu nie zgadzam się z „z definicji”, ponieważ nie jest to definicja (ponieważ jest niedokładna).
Oli

2
Gdy oceniamy wydajność różnych metod kompresji, najbardziej interesuje nas oczekiwany rozmiar wyjściowy dla przyszłych przykładów danych, które chcemy skompresować. Jeśli te dane są naprawdę losowe, to nie zawierają statystycznej regularności do wykorzystania w kompresji, więc dla sekwencji N losowych bajtów najlepszą możliwą rzeczą, jakiej moglibyśmy oczekiwać, jest oczekiwana długość wyjściowa N bajtów. W niektórych przykładach możemy zrobić trochę lepiej, w innych możemy zrobić coś gorszego (w praktyce prawie zawsze robimy gorzej), ale oczekiwana długość wyjściowa pozostaje taka sama.
ali_m

5
Mam na myśli „losowy” w znaczeniu Kołmogorowa , który dosłownie jest definiowany jako nieściśliwość. Nie ma uniwersalnego testu porównawczego dla kompresji, ponieważ różne algorytmy działają lepiej dla różnych typów danych. Dobrym początkiem może być po prostu przesłanie tekstu, np. wget http://mattmahoney.net/dc/enwik8.zipPobranie 96 MB (skompresowanego 21 MB) tekstu z Wikipedii. Aby uzyskać znacznie bardziej kompleksowy zestaw testów, zobacz tutaj .
ali_m

72

Cóż, słowo kluczowe było równoległe . Po wyszukaniu wszystkich równoległych narzędzi do kompresji znalazłem:

PXZ - Parallel XZ to narzędzie do kompresji, które korzysta z uruchamiania kompresji LZMA różnych części pliku wejściowego na wielu rdzeniach i procesorach jednocześnie. Jego głównym celem jest wykorzystanie wszystkich zasobów w celu przyspieszenia czasu kompresji przy minimalnym możliwym wpływie na współczynnik kompresji.

sudo apt-get install pxz

PLZIP - Lzip to bezstratny kompresor danych oparty na algorytmie LZMA, z bardzo bezpiecznym sprawdzaniem integralności i interfejsem użytkownika podobnym do gzip lub bzip2. Lzip dekompresuje prawie tak szybko jak gzip i kompresuje lepiej niż bzip2, co czyni go dobrze przystosowanym do dystrybucji oprogramowania i archiwizacji danych.

Plzip jest masowo równoległą (wielowątkową) wersją lzip używającą formatu pliku lzip; pliki produkowane przez plzip są w pełni kompatybilne z lzip.

Plzip jest przeznaczony do szybszej kompresji / dekompresji dużych plików na maszynach wieloprocesorowych, co czyni go szczególnie odpowiednim do dystrybucji dużych plików oprogramowania i archiwizacji danych na dużą skalę. Na plikach wystarczająco dużych plzip może korzystać z setek procesorów.

sudo apt-get install plzip

PIGZ - pigz, co oznacza równoległe wdrożenie GZip, jest w pełni funkcjonalnym zamiennikiem gzip, który wykorzystuje wiele procesorów i wiele rdzeni podczas kompresji danych.

sudo apt-get install pigz

PBZIP2 - pbzip2 to równoległa implementacja kompresora plików do sortowania bloków bzip2, który wykorzystuje pthreads i osiąga prawie liniowe przyspieszenie na maszynach SMP. Dane wyjściowe tej wersji są w pełni kompatybilne z bzip2 v1.0.2 (tj. Wszystko skompresowane za pomocą pbzip2 może zostać zdekompresowane za pomocą bzip2).

sudo apt-get install pbzip2

LRZIP - Wielowątkowy program do kompresji, który może osiągać bardzo wysokie współczynniki kompresji i szybkość, gdy jest używany z dużymi plikami. Używa połączonych algorytmów kompresji zpaq i lzma dla maksymalnej kompresji, lzo dla maksymalnej prędkości i redukcji redundancji dalekiego zasięgu rzip. Jest przeznaczony do skalowania wraz ze wzrostem wielkości pamięci RAM, co dodatkowo poprawia kompresję. Wybór optymalizacji rozmiaru lub prędkości pozwala na lepszą kompresję niż nawet lzma może zapewnić, lub lepszą prędkość niż gzip, ale z poziomami kompresji wielkości bzip2.

sudo apt-get install lrzip

Mały test kompresji (za pomocą testu stworzonego przez Oli):

ORYGINALNY ROZMIAR PLIKU - 100 MB
PBZIP2 - 101 MB (1% większy)
PXZ - 101 MB (1% większy)
PLZIP - 102 MB (1% większy)
LRZIP - 101 MB (1% większy)
PIGZ - 101 MB (1% większy )

Mały test porównawczy kompresji (przy użyciu pliku tekstowego):

ROZMIAR PLIKU ORYGINALNEGO - 70 KB Plik tekstowy
PBZIP2 - 16,1 KB (23%)
PXZ - 15,4 KB (22%)
PLZIP - 15,5 KB (22,1%)
LRZIP - 15,3 KB (21,8%)
PIGZ - 17,4 KB (24,8%)


Przykłady byłyby świetne.
earthmeLon

@earthmeLon Przeczytaj odpowiedź Oli, która wspomina, jak utworzyć przykładowy plik. Następnie postępuj zgodnie z poleceniami, których użyłem.
Luis Alvarado,

Mam nadzieję, że ich wyniki są kompatybilne. tzn. dane wyjściowe z lrzipmogą być pbzip2na przykład nieskompresowane .
Vineet Menon

10

Oprócz powyższego miłego podsumowania (dzięki Luis), w dzisiejszych czasach ludzie mogą również rozważyć PIXZ, który zgodnie z jego README (źródło: https://github.com/vasi/pixz - sam nie zweryfikowałem roszczeń ) ma pewne zalety w stosunku do PXZ.

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

Innymi słowy, PIXZ jest podobno bardziej wydajny pod względem pamięci i dysku i ma opcjonalną funkcję indeksowania, która przyspiesza dekompresję poszczególnych składników skompresowanych plików tar.


Rozumiem jednak, że pixzarchiwa nie są zgodne ze standardowym xzformatem pxz.
Mxx

5
@Mxx: Formaty plików są kompatybilne. pixzmoże dekompresować xzarchiwa i xzdekompresować pixzarchiwa. Jednak opcje wiersza poleceń są włączone xzi pixzróżnią się.
Snowball

Pliki indeksowane to duża wygrana pixz.
ostrokach

8

Aktualizacja:

XZ Utils obsługuje kompresję wielowątkową, ponieważ wersja 5.2.0 została pierwotnie błędnie udokumentowana jako dekompresja wielowątkowa.

Na przykład: tar -cf - source | xz --threads=0 > destination.tar.xz


Możesz także uruchomić, export XZ_DEFAULTS="-T 0" a następnie po prostu użyć zwykłego wywołania tar, tj tar cJf target.tar.xz source.
scai

4

lzop może być również opłacalną opcją, chociaż jest jednowątkowy.

Wykorzystuje bardzo szybki algorytm kompresji lempel-ziv-oberhumer , który jest 5-6 razy szybszy niż gzip w mojej obserwacji.

Uwaga: Chociaż nie jest jeszcze wielowątkowy, prawdopodobnie przewyższy Pigz w systemach 1-4 rdzeniowych. Dlatego postanowiłem to opublikować, nawet jeśli nie odpowiada to bezpośrednio na twoje pytanie. Spróbuj, może rozwiązać problem wąskiego gardła procesora, gdy używasz tylko jednego procesora i kompresujesz gorzej. Często uważałem, że jest to lepsze rozwiązanie niż np. Pigz.


Czy nie jest po prostu lepiej dekompresować? Kompresowanie zajmuje mniej więcej tyle samo co gzip
Lennart Rolland

Mogę również potwierdzić, że LZOP jest super szybki. Proxmox wykorzystuje lzop do tworzenia kopii zapasowych maszyn wirtualnych domyślnie.
Lonnie Best

1
lz4 jest jeszcze szybszy (i ma wersję wielowątkową).
David Balažic


3

To nie jest tak naprawdę odpowiedź, ale myślę, że jest wystarczająco istotne, aby podzielić się moimi testami porównawczymi, porównując prędkość gzipi pigzna prawdziwym HW w prawdziwym scenariuszu. Podobnie pigzjak ewolucja wielowątkowa, którą osobiście zdecydowałem się teraz zastosować.

Metadane:

  • Zastosowany sprzęt: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + dysk SSD Nvme
  • Dystrybucja GNU / Linux: Xubuntu 17.10 (artful)
  • gzip wersja: 1.6
  • pigz wersja: 2.4
  • Kompresowany plik to zrzut pamięci SQL 9,25 GiB

gzip szybki

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip Najlepsza

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz szybki

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigznajlepszy (nie zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopflialgorytm

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

Podsumowując, nie polecałbym zopflialgorytmu, ponieważ kompresja zajęła olbrzymią ilość czasu dla niezbyt znaczącej ilości zaoszczędzonego miejsca na dysku.

Wynikowe rozmiary plików:

  • najlepsze s: 1309 mln
  • szybkie s: 1680 M.
  • zopfli : 1180M

2

Zstandard obsługuje wielowątkowość od wersji 1.2.0 ¹. Jest to bardzo szybki kompresor i dekompresor przeznaczony do zastąpienia gzip, a także może kompresować tak wydajnie - jeśli nie lepiej - jak LZMA2 / XZ na najwyższych poziomach.

Musisz skorzystać z pomysłowej lub nowszej wersji lub skompilować najnowszą wersję ze źródła, aby uzyskać te korzyści. Na szczęście nie pociąga za sobą wielu zależności.

  1. W wersji 1.1.0 zstd istniała również pzstd innej firmy.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.