Muszę skompresować wiele bardzo dużych plików (80-GB GB) i jestem zaskoczony (brakiem) szybkości, jaką wykazuje mój system. Mam szybkość konwersji około 500 MB / min; za pomocą top
, wydaje mi się, że używam jednego procesora na około 100%.
Jestem pewien, że nie jest to (tylko) prędkość dostępu do dysku, ponieważ utworzenie tar
pliku (tak powstał plik 80G) zajęło tylko kilka minut (może 5 lub 10), ale po ponad 2 godzinach moja prosta komenda gzip jest nadal nie skończone.
W podsumowaniu:
tar -cvf myStuff.tar myDir/*
Zajęło mniej niż 5 minut, aby utworzyć plik o wielkości 87 G
gzip myStuff.tar
Zajęło dwie godziny i 10 minut, tworząc plik zip 55G.
Moje pytanie: czy to normalne? Czy istnieją pewne opcje gzip
przyspieszenia? Czy szybsze byłoby łączenie poleceń i używanie tar -cvfz
? Widziałem odniesienie do pigz
- Równoległej implementacji GZip - ale niestety nie mogę zainstalować oprogramowania na komputerze, którego używam, więc nie jest to dla mnie opcja. Zobacz na przykład to wcześniejsze pytanie .
Zamierzam sam wypróbować niektóre z tych opcji i zmierzyć czas - ale jest całkiem prawdopodobne, że nie trafię w „magiczną kombinację” opcji. Mam nadzieję, że ktoś na tej stronie zna właściwą sztuczkę, aby przyspieszyć.
Kiedy będę mieć wyniki innych prób, zaktualizuję to pytanie - ale jeśli ktoś ma szczególnie dobrą sztuczkę, byłbym bardzo wdzięczny. Może gzip zajmuje tylko więcej czasu niż sobie uświadomiłem ...
AKTUALIZACJA
Zgodnie z obietnicą wypróbowałem poniższe sztuczki: zmień stopień kompresji i zmień miejsce docelowe pliku. Otrzymałem następujące wyniki dla tar, który miał około 4,1 GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
Tak więc, zmiana flagi z domyślnej -6
na najszybszą -1
daje mi 30% przyspieszenie, przy (dla moich danych) prawie żadnej zmianie rozmiaru pliku zip. To, czy używam tego samego dysku, czy innego, nie ma w zasadzie żadnej różnicy (musiałbym uruchomić to wiele razy, aby uzyskać jakiekolwiek znaczenie statystyczne).
Jeśli ktoś jest zainteresowany, wygenerowałem te testy czasowe przy użyciu następujących dwóch skryptów:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
I drugi skrypt ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
Trzy rzeczy do zapamiętania:
- Używanie
/usr/bin/time
zamiasttime
, ponieważ wbudowane polecenie programubash
ma o wiele mniej opcji niż polecenie GNU - Nie zawracałem sobie głowy korzystaniem z tej
--format
opcji, chociaż to ułatwiłoby odczytanie pliku dziennika - Użyłem skryptu w skrypcie, ponieważ
time
wydawało się, że działa tylko na pierwszym poleceniu w sekwencji potokowej (więc sprawiłem, że wyglądało to jak jedno polecenie ...).
Po tym wszystkim, moje wnioski są
- Przyspiesz z
-1
flagą (zaakceptowana odpowiedź) - Znacznie więcej czasu zajmuje kompresja danych niż odczyt z dysku
- Zainwestuj w szybsze oprogramowanie do kompresji (
pigz
wydaje się dobrym wyborem). - Jeśli masz wiele plików do kompresji, możesz umieścić każde
gzip
polecenie w osobnym wątku i użyć więcej dostępnego procesora (biednego człowiekapigz
)
Dziękujemy wszystkim, którzy pomogli mi się tego wszystkiego nauczyć!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
pokaże, jak szybko twoja maszyna kompresuje rzeczy. uwaga dodatkowa 2: zapisz wynik na innej płycie.
man
stronie i nie przeczytałam aż tak daleko (ponieważ jest posortowana według „polecenia jednoliterowego”, czyli -#
) . To nauczy mnie RTFM! To będzie następna rzecz, której spróbuję!
pigz
i uruchomić z dowolnego miejsca, w którym go zbudowałeś, bez instalowania go. Jeśli nie ma kompilatora, możesz go skompilować krzyżowo na innym komputerze, chociaż zaczyna to być trudniejsze niż być tego warte. (Myślę, że w zależności od tego, jak bardzo potrzebujesz tej kompresji, aby działała szybciej.)