डिफ़ॉल्ट रूप से समानांतर bzip2 और gzip का उपयोग करने का सबसे अच्छा तरीका क्या है?


41

Bzip2 और gzip केवल एक कोर का उपयोग करते हैं, हालांकि कई कंप्यूटरों में एक से अधिक कोर होते हैं। लेकिन lbzip2, pbzip2 और pigz जैसे कार्यक्रम हैं, जो सभी उपलब्ध कोर का उपयोग करते हैं और bzip2 और gzip के साथ संगत होने का वादा करते हैं।

तो डिफ़ॉल्ट रूप से इन कार्यक्रमों का उपयोग करने का सबसे अच्छा तरीका क्या है, ताकि tar cfa file.tar.bz2 directorybzip2 के बजाय lbzip2 / pbzip2 का उपयोग किया जाए? बेशक मैं कुछ भी तोड़ना नहीं चाहता।


2
सभी के लिए जिज्ञासा से बाहर: क्या समानांतर gzip / bzip वास्तव में धारावाहिक से तेज है? मुझे लगता है कि hdd लिखने की गति और अन्य प्रतिबंध एक समस्या के अधिक हैं।
con-f-use

@ con-f- उपयोग तब तक नहीं जब तक कि आपके पास सैद्धांतिक रूप से SSD नहीं है, यह तेजी से हो सकता है क्योंकि संग्रह का कुल आकार बढ़ता है।
मार्को Ceppi

1
16 cpus के साथ एक सिस्टम पर, gzip से pigz पर स्विच करने का समय घटकर 1.2TB हो गया और इसे नेटवर्क पर स्थानांतरित कर दिया गया और 18 घंटे के बैकअप और 14 घंटे के परीक्षण से 4 घंटे के बैकअप और 2 घंटे के परीक्षण के परिणाम का परीक्षण किया। इस मामले में बहुत सारी संभावित अड़चनें, डिस्क की गति, नेटवर्क की गति, प्रसंस्करण शक्ति हैं, लेकिन निश्चित रूप से यह आईओ बाउंड से अधिक सीपीयू बाध्य था। यह एक उच्च अंत प्रणाली है, आपके परिणाम भिन्न हो सकते हैं। ऐसा नहीं है कि यह मायने रखता है, लेकिन यह RHEL6
cs_alumnus

जवाबों:


32

आप bzip2, bunzip2 और bzcat को lbzip2, और gzip, gunzip, gzcat और zcat से pigz से सहानुभूति दे सकते हैं:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

मैंने pbzip2 के बजाय lbzip2 चुना क्योंकि /usr/share/doc/pb/ipb2/README.gz के बजाय /us/share/doc/lbzip2/README.gz "nicer" दिखता है। इसके अलावा, टार मैनुअल lbzip2 के बारे में बात करता है

संपादित करें:

pigz-2.1.6, जो कि Precise Pangolin में शामिल है, ने अज्ञात प्रत्ययों (जैसे initramfs - *। img) के साथ फ़ाइलों को हटाने से इंकार कर दिया। यह पिग्ज-2.2.4 में तय किया गया है, जो क्वांटल के साथ जहाज करता है। तो आप क्वांटल तक प्रतीक्षा करना चाहते हैं, क्वांटल पैकेज को मैन्युअल रूप से स्थापित कर सकते हैं , या अभी तक गनज़िप / गज़क / ज़ैट को लिंक नहीं कर सकते हैं।


7
यह अच्छा काम करता है क्योंकि / usr / लोकल / बिन / ज्यादातर लोगों के $ PATH में / bin / से पहले आता है। अगर कुछ कॉल / बिन / गनज़िप को सीधे कॉल करता है या किसी के पास अपने $ PATH में पहले बिन है, तो वे पिग का उपयोग नहीं करेंगे। उनके लिए भी यह काम करने के लिए आप dpk-divert का उपयोग कर सकते हैं और सभी बायनेरिज़ के लिए ऐसा कुछ कर सकते हैं , sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipलेकिन संभावना है कि सभी gzip झंडों के साथ pigz 100% संगत नहीं है इसलिए सावधान रहें।
मार्क मैककिन्ट्री

31

सहानुभूति विचार वास्तव में ठीक है।
एक और काम करने वाला समाधान उर्फ ​​के लिए है tar:

alias tar='tar --use-compress-program=pbzip2'

या क्रमशः

alias tar='tar --use-compress-program=pigz'

यह एक अन्य प्रकार का डिफ़ॉल्ट बनाता है।


अतिरिक्त लाभ: यदि आप मूल कार्यक्षमता (किसी कारण से) को संरक्षित करना चाहते हैं, तो आप 'पार्टर' जैसे उपनाम का उपयोग कर सकते हैं .. दुख की बात यह है कि 'ptar' को perl कार्यान्वयन द्वारा लिया गया है
jena

13

सहानुभूति का उत्तर वास्तव में गलत है। यह पूरे सिस्टम के लिए डिफ़ॉल्ट gzip (या bzip2) को pigz (या pbzip2) से बदल देगा। हालांकि समानांतर कार्यान्वयन एकल प्रक्रिया संस्करणों के समान उल्लेखनीय हैं, कमांड लाइन विकल्पों में सूक्ष्म अंतर कोर सिस्टम प्रक्रियाओं को तोड़ सकते हैं जो उन अंतरों पर निर्भर करते हैं।

"--Use-compress-program" विकल्प ज्यादा बेहतर विकल्प है। एक दूसरा विकल्प (उर्फ की तरह) GNU टार द्वारा समर्थित TAR_OPTIONS वातावरण चर सेट करने के लिए होगा:

$ निर्यात TAR_OPTIONS = "- उपयोग-सेक-प्रोग्राम = pbzip2"
$ टार czf myfile.tar.bz2 mysubdir /

6
मैं 2011 से अब तक सिम्बलिंक का उपयोग कर रहा हूं और इसमें कोई टूट-फूट (एडिट में उल्लिखित केस के अलावा) नहीं देखी गई है। और अगर ऐसे सूक्ष्म अंतर नहीं पाए जाते हैं और रिपोर्ट किए जाते हैं, तो हम हमेशा के लिए गैर-समानांतर संस्करणों के साथ फंस जाएंगे। यदि आप TAR_OPTIONS = "- उपयोग-सेक-प्रोग्राम = pbzip2" का उपयोग करते हैं तो ऐसा नहीं लगता है कि आप bzip2 और gzip के बीच अंतर कर सकते हैं।
एलिम्हा

यह मेरे लिए काम नहीं किया।
डेरेक पर्किन्स

3

एक आकर्षक विकल्प डिफ़ॉल्ट रूप से मल्टीथ्रेडेड का उपयोग करने के लिए टार को फिर से जोड़ना है। इस स्टैकओवरफ़्लो उत्तर से नकल की गई

प्रतिस्थापन के साथ Recompiling

यदि आप स्रोतों से टार का निर्माण करते हैं, तो आप मापदंडों के साथ फिर से जुड़ सकते हैं

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

इन विकल्पों के साथ टार recompiling करने के बाद आप टार की मदद से आउटपुट की जांच कर सकते हैं:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

-2

अपने ~ / .bash_aliases में उपयोग करें:

alias gzip="pigz"
alias gunzip="unpigz"

1
यह केवल तभी gzip(या gunzip) प्रोग्राम को सीधे शेल के कमांड-लाइन पर कॉल करने पर काम करेगा । अन्य कार्यक्रम (जैसे tar) उससे प्रभावित नहीं होंगे।
क्रिश्चियन हडॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.