टार + gzip / bzip संपीड़न / अपघटन के लिए मल्टी कोर का उपयोग


225

मैं सामान्य रूप से उपयोग करके tar zcvfऔर डीकंप्रेस tar zxvf(आदत के कारण गज़िप का उपयोग करके) को संपीड़ित करता हूं ।

मैंने हाल ही में हाइपरथ्रेडिंग के साथ एक क्वाड कोर सीपीयू प्राप्त किया है, इसलिए मेरे पास 8 तार्किक कोर हैं, और मैं ध्यान देता हूं कि कई कोर संपीड़न / अपघटन के दौरान अप्रयुक्त हैं।

क्या कोई तरीका है कि मैं अप्रयुक्त कोर का उपयोग इसे तेज करने के लिए कर सकता हूं?


ऊपर Xiong Chiamiov द्वारा प्रस्तावित समाधान खूबसूरती से काम करता है। मैंने .tar.bz2 के साथ सिर्फ अपने लैपटॉप का बैकअप लिया था और केवल एक सीपीयू थ्रेड का उपयोग करते हुए 132 मिनट लग गए। फिर मैंने स्रोत से टार को संकलित और स्थापित किया: gnu.org/software/tar मैंने कॉन्फ़िगर चरण में वर्णित विकल्पों को शामिल किया: / .configure --with-gzip = pigz --with-bzip2 = lbzip2.with-lzip = plzip मैंने बैकअप फिर से चलाया और इसमें केवल 32 मिनट लगे। यह 4X सुधार से बेहतर है! मैंने सिस्टम मॉनीटर को देखा और इसने पूरे समय में सभी 4 सीपीयू (8 थ्रेड्स) को 100% तक समतल रखा। यह सबसे अच्छा उपाय है।
वारेन सेवेरिन

जवाबों:


309

आप गज़िप के बजाय पिगज़ का उपयोग कर सकते हैं , जो कई कोर पर गज़िप संपीड़न करता है। -Z विकल्प का उपयोग करने के बजाय, आप इसे पिग के माध्यम से पाइप करेंगे:

tar cf - paths-to-archive | pigz > archive.tar.gz

डिफ़ॉल्ट रूप से, पिग उपलब्ध कोर की संख्या का उपयोग करता है, या आठ अगर यह क्वेरी नहीं कर सकता है। आप -pn के लिए और अधिक पूछ सकते हैं, उदाहरण -p 32. पिगज़ में gzip के समान विकल्प हैं, इसलिए आप -9 के साथ बेहतर संपीड़न का अनुरोध कर सकते हैं। उदाहरण के लिए

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

3
आप उसी शैली में डीकंप्रेस करने के लिए पिग का उपयोग कैसे करते हैं? या यह केवल संपीड़न के लिए काम करता है?
user788171

42
पिग डीकंप्रेसन के लिए कई कोर का उपयोग करता है, लेकिन केवल एक कोर पर सीमित सुधार के साथ। डिफ्लेट प्रारूप समानांतर विघटन के लिए खुद को उधार नहीं देता है। विसंपीड़न भाग को क्रमिक रूप से किया जाना चाहिए। पिग डीकंप्रेसन के लिए अन्य कोर का उपयोग सीआरसी पढ़ने, लिखने और गणना के लिए किया जाता है। जब दूसरी ओर संपीड़ित करने, pigz का एक पहलू के करीब हो जाता n के साथ सुधार n कोर।
मार्क एडलर

7
यहाँ हाइफ़न stdout है ( इस पृष्ठ को देखें )।
गैरेट

3
हाँ। दोनों दिशाओं में 100% संगत।
मार्क एडलर

4
प्रभावी ढंग से कोई सीपीयू समय नहीं है टारिंग खर्च किया जाता है, इसलिए यह बहुत मदद नहीं करेगा। टार प्रारूप फाइलों के बीच में हेडर ब्लॉक के साथ इनपुट फाइल की एक प्रति है।
मार्क एडलर

324

आप टार ध्वज का उपयोग भी कर सकते हैं "- उपयोग-सेक-प्रोग्राम =" टार को बताने के लिए कि किस संपीड़न कार्यक्रम का उपयोग करना है।

उदाहरण के लिए उपयोग करें:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
यह ज्ञान का एक छोटा सा डला है और अधिक उत्थान के योग्य है। मुझे पता नहीं था कि यह विकल्प भी अस्तित्व में है और मैंने वर्षों में कुछ बार मैन पेज पढ़ा है।
रान्डेल हंट

2
@ValerioSchiavoni: यहां नहीं, मुझे सभी 4 कोर (Ubuntu 15.04 'Vivid') पर पूरा लोड मिलता है।
बोवेंडर

8
मुझे लगता है कि tar - dir_to_zip | pv | pigz > tar.filepv मुझे अनुमान लगाने में मदद करता है, आप इसे छोड़ सकते हैं। लेकिन फिर भी लिखना और याद रखना आसान है।
ऑफेंसो

@ नाथन। व्हाट्सन-हाई हां तुम करते हो। बस कार्यक्रम का नाम और उद्धरणों में तर्क संलग्न करें। man tarऐसा कहते हैं, जैसा कि यह होता है
मार्क.2377

1
2020 में, zstdऐसा करने के लिए सबसे तेज़ उपकरण है। संपीड़ित और विघटित करते समय ध्यान देने योग्य स्पीडअप। tar -cf --use-compress-program=zstdmtमल्टी-थ्रेडिंग के साथ ऐसा करने के लिए उपयोग करें ।
जगदलपुर

112

सामान्य कोशिश

tarकार्यक्रम के लिए विकल्प है :

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

आप अभिलेखीय या कंप्रेसर उपयोगिता के मल्टीथ्रेड संस्करण का उपयोग कर सकते हैं।

अधिकांश लोकप्रिय मल्टीथ्रेड आर्काइव्स पिज़्ज़ ( गज़िप के बजाय) और pbzip2 (bzip2 के बजाय) हैं। उदाहरण के लिए:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

आर्काइव को -d को स्वीकार करना होगा। यदि आपकी प्रतिस्थापन उपयोगिता में यह पैरामीटर नहीं है और / या आपको अतिरिक्त पैरामीटर निर्दिष्ट करने की आवश्यकता है, तो पाइप का उपयोग करें (यदि आवश्यक हो तो पैरामीटर जोड़ें):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

सिंगलथ्रेड और मल्टीथ्रेड के इनपुट और आउटपुट संगत हैं। आप मल्टीथ्रेड वर्जन और डीकंप्रेस को सिंगलथ्रेड वर्जन और इसके विपरीत का उपयोग करके कंप्रेस कर सकते हैं।

p7zip

संपीड़न के लिए p7zip के लिए आपको निम्नलिखित की तरह एक छोटे शेल स्क्रिप्ट की आवश्यकता है:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

इसे 7zhelper.sh के रूप में सहेजें। यहाँ उपयोग का उदाहरण:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

XZ

बहुपरत XZ समर्थन के बारे में। यदि आप संस्करण 5.2.0 या XZ यूटिल्स के ऊपर चल रहे हैं, तो आप पर्यावरण चर XZ_DEFAULTS के माध्यम से सेटिंग -Tया --threadsउचित मूल्य पर संपीड़न के लिए कई कोर का उपयोग कर सकते हैं (जैसेXZ_DEFAULTS="-T 0" ) के ।

यह 5.1.0alpha संस्करण के लिए मनुष्य का एक टुकड़ा है:

बहुपरत संपीड़न और विघटन अभी तक लागू नहीं किए गए हैं, इसलिए इस विकल्प का अभी कोई प्रभाव नहीं है।

हालाँकि यह उन फ़ाइलों के अपघटन के लिए काम नहीं करेगा जो थ्रेडिंग सक्षम होने के साथ संकुचित भी नहीं हुए हैं। संस्करण 5.2.2 के लिए आदमी से:

थ्रेडेड अपघटन अभी तक लागू नहीं किया गया है। यह केवल उन फाइलों पर काम करेगा जिनमें ब्लॉक हेडर में आकार की जानकारी के साथ कई ब्लॉक हैं। बहु-थ्रेडेड मोड में संपीड़ित सभी फ़ाइलें इस स्थिति को पूरा करती हैं, लेकिन एकल-थ्रेडेड मोड में संपीड़ित फ़ाइलें उपयोग नहीं की जाती हैं, भले ही --block-size = size का उपयोग किया जाता है।

प्रतिस्थापन के साथ 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

1
यह वास्तव में सबसे अच्छा जवाब है। मैं निश्चित रूप से मेरे टार पुनर्निर्माण करेंगे!

1
मुझे बस pbzip2 और mpibzip2 मिला । mpibzip2 क्लस्टर के लिए या यदि आपके पास एक लैपटॉप और उदाहरण के लिए एक मल्टीकोर डेस्कटॉप कंप्यूटर है, तो बहुत आशाजनक लगता है।

यह एक महान और विस्तृत जवाब है। यह उल्लेख करना अच्छा हो सकता है कि मल्टीथ्रेडेड संपीड़न (जैसे के साथ pigz) केवल तभी सक्षम होता है जब वह फ़ाइल से पढ़ता है। प्रसंस्करण STDIN वास्तव में धीमी हो सकती है।
o

3
xzविकल्प के लिए प्लस 1 । यह सबसे सरल, अभी तक प्रभावी दृष्टिकोण है।
सेलुडु

2
export XZ_DEFAULTS="-T 0"xz संपीड़न के लिए tarविकल्प -Jके साथ कॉल करने से पहले एक आकर्षण की तरह काम करता है।
scai

13

आप -Iटार --use-compress-programस्विच के लिए शॉर्टकट का उपयोग कर सकते हैं , और pbzip2कई कोर पर bzip2 संपीड़न के लिए आह्वान कर सकते हैं :

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

एक अच्छा टी एल; के लिए @ MaximSuslov के डॉ जवाब
einpoklum

यह रिटर्न tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

1

यदि आप फ़ाइल नाम और संपीड़न विकल्पों के साथ अधिक लचीलापन चाहते हैं, तो आप उपयोग कर सकते हैं:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

चरण 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

यह कमांड उन फ़ाइलों की तलाश करेगी जिन्हें आप इस मामले में संग्रह करना चाहते हैं /my/path/*.sqlऔर /my/path/*.log-o -name "pattern"जितने चाहो उतने जोड़ लो।

-execके परिणामों का उपयोग करके अगली कमांड निष्पादित करेगा find:tar

चरण 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformएक साधारण स्ट्रिंग प्रतिस्थापन पैरामीटर है। यह संग्रह से फ़ाइलों के पथ को हटा देगा इसलिए टारबॉल की जड़ निकालने के दौरान वर्तमान निर्देशिका बन जाती है। ध्यान दें कि आप -Cनिर्देशिका को बदलने के लिए विकल्प का उपयोग नहीं कर सकते हैं क्योंकि आप लाभ खो देंगेfind : निर्देशिका की सभी फाइलें शामिल की जाएंगी।

-Ptarनिरपेक्ष रास्तों का उपयोग करने के लिए कहता है, इसलिए यह "सदस्य नामों से अग्रणी '/' चेतावनी को ट्रिगर नहीं करता है"। --transformवैसे भी '' '' को हटाया जाना ।

-cf -tarटारबॉल नाम का उपयोग करने के लिए कहता है जिसे हम बाद में निर्दिष्ट करेंगे

{} +findपहले मिले हर फ़ाइल्स का उपयोग करता है

चरण 3: pigz

pigz -9 -p 4

आप जितने चाहें उतने मापदंडों का उपयोग करें। इस मामले -9में संपीड़न स्तर है और-p 4 संपीड़न के लिए समर्पित कोर की संख्या है। यदि आप इसे एक भारी लोड किए गए वेबसर्वर पर चलाते हैं, तो आप संभवतः सभी उपलब्ध कोर का उपयोग नहीं करना चाहते हैं।

चरण 4: संग्रह का नाम

> myarchive.tar.gz

आखिरकार।


0

एक अपेक्षाकृत नया (डी) संपीड़न उपकरण जिसे आप विचार कर सकते हैं वह zstandard है । यह अतिरिक्त कोर का उपयोग करने का एक उत्कृष्ट काम करता है, और जब संपीड़न अनुपात बनाम (डी) संपीड़न समय की बात आती है, तो इसने कुछ महान व्यापार बंद कर दिए हैं। यह आपके संपीड़न अनुपात की जरूरतों के आधार पर अत्यधिक ट्वीक-सक्षम भी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.