Paralelné komprimovanie a dekomprimovanie s pbzip2

logo bzip2
Ak zvyknete komprimovať a dekomprimovať veľké objemy dát, možno sa vám bude hodiť nasledujúci tip, ako nahradiť bzip2 kompatibilnou alternatívou pbzip2.
Bzip2 umožňuje dosiahnuť výborný kompresný pomer, ale je pomerne pomalý.

pbzip2 je paralelná implementácia blokového bzip2 triediaceho kompresného algoritmu, ktorá používa vlákna na zrýchlenie kompresie a dekompresie na SMP systémoch. Výstup je plne kompatibilný s bzip2 verziou, čiže hocičo skomprimované s pbzip2 je možné dekomprimovať s bzip2.


$ apt-cache show pbzip2 | grep -A 10 -e '^Description'
Description: parallel bzip2 implementation
pbzip2 is a parallel implementation of the bzip2 block-sorting file
compressor that uses pthreads and achieves near-linear speedup on SMP
machines. The output of this version is fully compatible with bzip2
v1.0.2 (ie: anything compressed with pbzip2 can be decompressed with
bzip2).
Homepage: http://compression.ca/pbzip2/
Tag: implemented-in::c++, interface::commandline, role::program, scope::utility, use::compressing, works-with::archive, works-with::file

Než začnete experimentovať, odporúčam zistiť si verziu:


$ pbzip2 -V
Parallel BZIP2 v1.1.1 - by: Jeff Gilchrist [http://compression.ca]
[Apr. 17, 2010] (uses libbzip2 by Julian Seward)
Major contributions: Yavor Nikolov <nikolov.javor+pbzip2@gmail.com>

Ak máte aspoň verziu 1.1.1, môžete používať rovnaké prepínače ako pre bzip2. Staršia verzia (napr. 1.0.2) žiaľ nevie fungovať vo forme filtra a natvrdo vyžaduje ako vstup cestu k súboru. Inými slovami, stará verzia pbzip2 obmedzuje možnosti skriptovania.

Pre niektoré staršie systémy (napr. Debian lenny) však nenájdete novšiu verziu balíka. Vtedy sa vám bude hodiť do skriptu niekoľko riadkov kódu, ktoré pri staršej verzii pbzip2 použijú obyčajný bzip2. Ak však verzia pbzip2 bude vyhovujúca, použje sa pbzip2 a dôjde k zrýchleniu kompresie/dekompresie.

Túto nekompatibilitu v prepínačoch pbzip2 vyrieši nasledujúci shell kód:


# zisti verziu pbzip2
pbzip2_ver=`pbzip2 -V 2>&1 | awk -v FS='[v.]' '/^Parallel BZIP2 v/ { print $3; }'`
# ak je error, default je verzia 0, cize 1.0.x
pbzip2_ver="${pbzip2_ver:-0}"
#echo "ver='$pbzip2_ver'"
if [ -x /usr/bin/pbzip2 -a $pbzip2_ver > 1 ]; then # at least 1.1 version required
COMPRESS="pbzip2 -9 -p1" # use max compression, 1 CPU only
else
COMPRESS="bzip2 --best"
fi

Parametrom -p1 môžete obmedziť počet procesorov/vlákien, ktoré pbzip2 použije. To s výhodou použijete tam, kde by využitie všetkých CPU (štandardné správanie pbzip2) obmedzilo iné dôležitejšie úlohy. Aj súbory skomprimované s parametrom -p1 však možno dekomprimovať vo viacerých vláknach.

Teším sa, až niekto dá vedieť o nejakých kreatívnych nápadoch, ako tento tip využil.