बहुत बड़ी (100G) फ़ाइलों को ज़िप करने का समय


27

मैं खुद को बहुत बड़ी फ़ाइलों (80-ish GB) को संकुचित करने के लिए पा रहा हूं, और मुझे आश्चर्य है कि (कमी) मेरी प्रणाली का प्रदर्शन कर रही है। मुझे लगभग 500 एमबी / मिनट रूपांतरण की गति मिलती है; का उपयोग करते हुए top, मैं एक CPU का उपयोग लगभग 100% पर कर रहा हूँ।

मुझे पूरा यकीन है कि यह (सिर्फ) डिस्क एक्सेस स्पीड नहीं है, क्योंकि एक tarफाइल बनाने के बाद (यह कि 80 जी फाइल कैसे बनाई गई थी) बस कुछ ही मिनट लगे (शायद 5 या 10), लेकिन 2 घंटे से अधिक समय के बाद भी मेरी सरल gzip कमांड अभी भी है नहीं हुआ।

संक्षेप में:

tar -cvf myStuff.tar myDir/*

87 G टार फ़ाइल बनाने के लिए <5 मिनट का समय लिया

gzip myStuff.tar

55G ज़िप फ़ाइल बनाते हुए दो घंटे 10 मिनट का समय लिया।

मेरा प्रश्न: क्या यह सामान्य है? क्या gzipचीजों को गति देने के लिए कुछ निश्चित विकल्प हैं? क्या यह आदेशों का उपयोग करने और उपयोग करने के लिए तेज़ होगा tar -cvfz? करने के लिए मैं देखा संदर्भ pigz- GZip की समानांतर कार्यान्वयन - लेकिन दुर्भाग्य से मैं मशीन मैं उपयोग कर रहा हूँ पर सॉफ़्टवेयर स्थापित नहीं कर सकते, तो यह है कि मेरे लिए एक विकल्प नहीं है। उदाहरण के लिए यह पहले का प्रश्न देखें ।

मैं इनमें से कुछ विकल्पों को स्वयं आजमाने और उन्हें समय देने का इरादा कर रहा हूं - लेकिन यह काफी संभावना है कि मैं विकल्पों के "जादू संयोजन" को नहीं मारूंगा। मुझे उम्मीद है कि इस साइट पर कोई व्यक्ति चीजों को गति देने के लिए सही चाल जानता है।

जब मेरे पास अन्य परीक्षणों के परिणाम उपलब्ध होंगे तो मैं इस प्रश्न को अपडेट करूंगा - लेकिन अगर किसी के पास विशेष रूप से अच्छी ट्रिक उपलब्ध है, तो मैं वास्तव में इसकी सराहना करूंगा। हो सकता है कि gzip को मेरे द्वारा महसूस किए जाने की तुलना में अधिक प्रसंस्करण समय लगे ...

अद्यतन करें

जैसा कि वादा किया गया था, मैंने नीचे दिए गए ट्रिक्स को सुव्यवस्थित करने की कोशिश की: संपीड़न की मात्रा को बदलें, और फ़ाइल के गंतव्य को बदलें। मुझे एक टार के लिए निम्नलिखित परिणाम मिले जो लगभग 4.1GB था:

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

तो हां, झंडे को डिफ़ॉल्ट -6से सबसे तेज में बदलना -1मुझे 30% स्पीडअप देता है, (मेरे डेटा के लिए) शायद ही ज़िप फ़ाइल के आकार में कोई बदलाव हुआ हो। चाहे मैं एक ही डिस्क का उपयोग कर रहा हूं या कोई अन्य अनिवार्य रूप से कोई अंतर नहीं करता है (मुझे किसी भी सांख्यिकीय महत्व को प्राप्त करने के लिए इसे कई बार चलाना होगा)।

अगर किसी को दिलचस्पी है, तो मैंने निम्नलिखित दो लिपियों का उपयोग करके इन समयसीमाओं को उत्पन्न किया:

#!/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

और दूसरी स्क्रिप्ट ( 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

तीन बातें ध्यान दें:

  1. /usr/bin/timeइसके बजाय का उपयोग करना time, क्योंकि अंतर्निहित कमांड में bashGNU कमांड की तुलना में कई कम विकल्प हैं
  2. मैंने --formatविकल्प का उपयोग करने की जहमत नहीं उठाई हालांकि इससे लॉग फाइल को पढ़ने में आसानी होगी
  3. मैंने एक स्क्रिप्ट-इन-ए-स्क्रिप्ट का उपयोग किया timeथा, क्योंकि यह केवल एक पाइप्ड अनुक्रम में पहली कमांड पर काम करता था (इसलिए मैंने इसे एक एकल कमांड की तरह देखा ...)।

यह सब सीखने के साथ, मेरे निष्कर्ष हैं

  1. -1झंडे के साथ चीजों को गति दें (स्वीकृत उत्तर)
  2. बहुत अधिक समय डिस्क से पढ़ने की तुलना में डेटा को संपीड़ित करने में खर्च होता है
  3. तेजी से संपीड़न सॉफ्टवेयर में निवेश करें ( pigzएक अच्छा विकल्प जैसा लगता है)।
  4. यदि आपके पास संपीड़ित करने के लिए कई फाइलें हैं, तो आप प्रत्येक gzipकमांड को अपने स्वयं के धागे में रख सकते हैं और उपलब्ध सीपीयू (गरीब आदमी pigz) का अधिक उपयोग कर सकते हैं

सभी को धन्यवाद जिन्होंने मुझे यह सब सीखने में मदद की!


tar -cvf कोई कम्प्रेशन नहीं करता है, इसलिए यह जल्दी होगा
parkydr

2
@ फ़्लोरिस: आप किस तरह के डेटा को कंप्रेस करने की कोशिश कर रहे हैं? साइड-नोट: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzआपको दिखाएगा कि आपकी मशीन कितनी तेजी से सामान को संकुचित कर रही है। साइड-नोट 2: परिणाम को एक अलग डिस्क पर संग्रहीत करें।
अकीरा

3
क्षमा करें, मैंने आपके प्रश्न को गलत बताया। gzip के पास सबसे तेज संपीड़न का चयन करने का विकल्प है
Parkydr

1
@ पेपर: - विकल्प विकल्प वह है जिसके बारे में मुझे नहीं पता था ... यह पृष्ठ का सबसे अंतिम एक है man, और मैंने इसे दूर तक नहीं पढ़ा (क्योंकि यह 'सिंगल लेटर कमांड' द्वारा क्रमबद्ध है, जो है -#) । वह मुझे RTFM सिखाएगा! यह मैं कोशिश करता हूँ अगली बात होगी!
फ्लोरिस

2
ध्यान दें कि यदि मशीन पर एक उपयुक्त संकलक उपलब्ध है, और फाइलसिस्टम अनुमतियों को उन निर्देशिकाओं से बायनेरिज़ को प्रतिबंधित करने के लिए सेट नहीं किया गया है, जिनके पास आपकी पहुंच है, तो pigzआप इसे संस्थापित कर सकते हैं और जहाँ भी आप इसे बनाने के लिए हुआ है, इसे स्थापित किए बिना चला सकते हैं। यदि कोई संकलक नहीं है, तो आप इसे दूसरे कंप्यूटर पर क्रॉस-कंपाइल कर सकते हैं, हालांकि यह इसके लायक होने की तुलना में अधिक प्रयास में शुरू हो रहा है। (तेजी से चलाने के लिए आपको इस संपीड़न की कितनी बुरी तरह आवश्यकता है, इस पर निर्भर करता है।)
डेविड जेड

जवाबों:


27

आप का उपयोग करके gzip की गति को बदल सकते हैं --fast --bestया -#जहां # 1 और 9 के बीच की संख्या है (1 सबसे तेज़ है लेकिन कम संपीड़न, 9 सबसे धीमी लेकिन अधिक संपीड़न है)। डिफ़ॉल्ट रूप से gzip 6 स्तर पर चलता है।


26

टारगेट को gzip की तुलना में बहुत कम समय लगता है, यह है कि आपकी फ़ाइलों को एक फ़ाइल में कॉपी करने में बहुत कम कम्प्यूटेशनल ओवरहेड है (जो ऐसा करता है)। दूसरी तरफ gzip, वास्तव में टार फाइल को सिकोड़ने के लिए कम्प्रेशन एल्गोरिदम का उपयोग कर रहा है।

समस्या यह है कि गज़िप एक ही धागे के लिए विवश है (जैसा कि आपने खोजा)।

पिग दर्ज करें , जो संपीड़न करने के लिए कई थ्रेड्स का उपयोग कर सकता है। इसका उपयोग कैसे किया जाएगा, इसका एक उदाहरण:

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

एक बहन साइट पर --use-compress-program ऑप्शन का एक अच्छा succint सारांश है ।


आपके उत्तर और लिंक के लिए धन्यवाद। मैंने वास्तव में प्रश्न में पिग का उल्लेख किया है।
फ्लोरिस

यह यहाँ सही उत्तर है ..!
स्टॉल्कविक

4

मैं लगभग 100% पर एक ही CPU का उपयोग कर रहा हूँ।

इसका मतलब है कि I / O प्रदर्शन समस्या नहीं है, लेकिन संपीड़न केवल एक थ्रेड (जो कि gzip के साथ मामला होगा) का उपयोग कर रहा है।

यदि आप अन्य उपकरणों को स्थापित करने के लिए आवश्यक एक्सेस / एग्रीमेंट प्राप्त करने का प्रबंधन करते हैं, तो 7zip मल्टी कोर CPUs का लाभ उठाने के लिए कई थ्रेड्स का समर्थन करता है, हालांकि मुझे यकीन नहीं है कि यह gzip फॉर्मेट के साथ-साथ अपने लिए भी विस्तारित होता है।

यदि आप समय के लिए सिर्फ गज़िप का उपयोग करने के लिए अटक गए हैं और आपके पास संपीड़ित करने के लिए कई फाइलें हैं, तो आप उन्हें व्यक्तिगत रूप से संपीड़ित करने की कोशिश कर सकते हैं - इस तरह आप समानांतर में एक से अधिक प्रक्रिया चलाकर उस मल्टी-कोर सीपीयू का अधिक उपयोग करेंगे। सावधान रहें कि इसे ज़्यादा न करें क्योंकि जैसे ही आप अपने आई / ओ सबसिस्टम के प्रदर्शन की क्षमता के आस-पास कहीं भी पहुँच जाते हैं, सिर के आंदोलनों की विलंबता के रूप में अवक्षेपण (यदि आप एक प्रक्रिया / थ्रेड का उपयोग कर रहे हैं) से कम हो जाएगा टोंटी।


आपके सहयोग के लिए धन्यवाद। आपने मुझे एक विचार दिया (जिसके लिए आपको एक उत्थान मिलता है): चूंकि मेरे पास बनाने के लिए कई अभिलेखागार हैं, मैं सिर्फ व्यक्तिगत आदेशों का पालन कर सकता हूं &- फिर सिस्टम को वहां से इसकी देखभाल करने दें। प्रत्येक अपने स्वयं के प्रोसेसर पर चलेगा, और चूंकि मैं आई / ओ की तुलना में संपीड़न पर अधिक समय बिताता हूं, इसलिए उन सभी 10 को करने में एक ही समय लगेगा। इसलिए मुझे एक निष्पादन योग्य "सिंगल कोर परफॉर्मेंस" मिलती है, जो सिंगल थ्रेडेड है ...
फ्लोरिस

1

एक पिगज़ में उपलब्ध प्रक्रिया की संख्या का फायदा उठा सकता है जो आमतौर पर तेजी से प्रदर्शन होता है जैसा कि निम्न कमांड में दिखाया गया है

tar cf - डायरेक्टरी टू आर्काइव | पिग -०-पी लार्जनबरी> mydir.tar.gz

उदाहरण - तार cf - पाथा | pigz -0 -p 32> patha.tar.gz

यह संभवत: पोस्ट में दी गई विधियों की तुलना में तेज है -p ऐसी प्रक्रियाओं की संख्या है जिन्हें कोई भी चला सकता है। मेरे व्यक्तिगत अनुभव में एक बहुत बड़े मान को स्थापित करने के लिए यदि निर्देशिका को संग्रहित नहीं किया जाता है, तो बड़ी संख्या में छोटी फ़ाइलों का समावेश होता है। डिफ़ॉल्ट मान माना जाता है। 8. बड़ी फ़ाइलों के लिए, मेरी अनुशंसा इस मूल्य को सिस्टम पर समर्थित थ्रेड्स की कुल संख्या के रूप में सेट करने के लिए होगी।

उदाहरण एक 32 सीपीयू मशीन मदद करता है के मामले में पी = 32 के मूल्य की स्थापना।

0 का मतलब सबसे तेज़ पिगमेंट कम्प्रेशन के लिए है क्योंकि यह आर्काइव को कंप्रेस नहीं करता है और बल्कि स्पीड पर फोकस्ड होता है। संपीड़न के लिए डिफ़ॉल्ट मान 6 है।

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