कुशलतापूर्वक bzip2 के लिए gzip फ़ाइलों को परिवर्तित करना


10

मेरे पास gzip फ़ाइलों का एक गुच्छा है जिसे मुझे हर अब bzip2 में बदलना है। वर्तमान में, मैं एक शेल स्क्रिप्ट का उपयोग कर रहा हूं जो कि बस 'गनज़िप की प्रत्येक फ़ाइल और फिर' बज़िप 2 है। हालांकि यह काम करता है, इसे पूरा करने में बहुत समय लगता है ।

क्या इस प्रक्रिया को और अधिक कुशल बनाना संभव है? मैं गोता लगाने के लिए तैयार हूं और यदि आवश्यक हो तो गनज़िप और बज़िप 2 के स्रोत कोड को देखने के लिए तैयार हूं, लेकिन मैं सिर्फ अदायगी सुनिश्चित करना चाहता हूं। क्या प्रक्रिया की दक्षता में सुधार की कोई उम्मीद है?

जवाबों:


1

यह प्रश्न बहुत समय पहले पूछा गया था जब pbzip2 या तो उपलब्ध नहीं था या स्टड से संपीड़ित करने में सक्षम नहीं था, लेकिन अब आप समानांतर और pbzip2 ( bzip2 के बजाय ) का उपयोग करते हुए दोनों असम्पीडित और संपीड़ित चरणों को समानांतर कर सकते हैं :

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

जो bzip2 का उपयोग करने की तुलना में काफी तेज है ।


नमस्ते, मैंने इसका उत्तर स्वीकार कर लिया है क्योंकि यह आज प्रश्न पर ठोकर खा रहे लोगों के लिए सबसे अच्छा विकल्प देता है। pbzip2उल्लेख के लिए धन्यवाद । यदि लिंक किसी और के लिए लोड नहीं होता है, तो यहां प्रोजेक्ट पेज और मैन पेज है
सूंदर - मोनिका

15

एक कदम में गनज़िप और दूसरे में बज़िप 2 के बजाय, मुझे आश्चर्य है कि क्या यह पाइप का उपयोग करने के लिए अधिक कुशल होगा। कुछ इस तरहgunzip --to-stdout foo.gz | bzip2 > foo.bz2

मैं दो या अधिक सीपीयू के साथ सोच रहा हूं, यह निश्चित रूप से तेज होगा। लेकिन शायद केवल एक कोर के साथ भी। मैं शर्मनाक रूप से यह कोशिश नहीं कर रहा हूँ, हालांकि।


2
+1 पाइपिंग के लिए, डिस्क I / O कुछ ऐसा है जिससे आप बचना चाहते हैं। संपीड़न के लिए, जब तक मैं गलत नहीं हूँ, bzip2 समांतर नहीं है। : आप parallell में संपीड़ित करने के लिए pbzip2 की तरह कुछ का उपयोग करना होगा compression.ca/pbzip2
gustafc

... और दुर्भाग्य से, ऐसा प्रतीत नहीं होता है कि कोई भी समानांतर gzip डिकम्प्रेसन उपयोगिता उपलब्ध है।
gustafc

@gustafc: pbzip2 के लिंक के लिए धन्यवाद, यह बहुत मददगार था ... @OP: मैं पाइप को काटने वाली पाइप से दूर भागता हूं, मैं भ्रष्ट gz फ़ाइलों से निपटने में सक्षम होना चाहता हूं, आदि, उन्हें पाइप में खोए बिना ...
सूंदर -

4
@gustafc: यहां तक कि अगर bzip2और gzipआंतरिक रूप से समानांतर में काम नहीं करते हैं, एक पाइप का उपयोग करके आप समानांतर में उन्हें काम करते हैं, क्योंकि एक पाइप परोक्ष दो प्रक्रियाओं, जो शुरू होता है हो सकता है जाएगा समानांतर में चलाते हैं। तो कम से कम विघटन और संपीड़न समानांतर में चलेंगे।
साल्स्के

1
@ स्लेसके, भले ही आप सिद्धांत में सही हैं, bzip2सीपीयू का उपयोग gunzipएक को बौना करता है, इसलिए व्यवहारिकता में आपको यहां मिलने वाली समानता न्यूनतम है। डिस्क IO करने के लिए नहीं होने के बावजूद अभी भी अच्छा है!
जोहान वाल्स

6

जीएनयू समानांतर ( http://www.gnu.org/software/parallel ) एक विकल्प हो सकता है यदि आपके पास कई कोर (या यहां तक ​​कि कई मशीनें हैं):

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

विवरण और विकल्पों के लिए ट्यूटोरियल / मैन पेज पढ़ें।


3

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


क्या एल्गोरिदम के पास कोई अतिव्यापी कदम नहीं है जैसे कि मैं एक कदम को gzip के विघटन में छोड़ सकता हूं और bzip संपीड़न में भी ऐसा ही हो सकता है?
सूंदर -

2
@ सूंदर मुझे ऐसा नहीं लगता। gzipबर्म्पस bzip2-व्हीलर का उपयोग करते समय लिम्पेल-ज़िव 77 का उपयोग करता है। विभिन्न एल्गोरिदम, मुझे डर है।
new123456

2

कभी-कभी, मुझे लॉग फ़ाइलों के साथ एक ही काम करने की आवश्यकता होती है। मैं सबसे छोटी * .gz फाइलें पहले ( ls -rS), गुनजिप और फिर व्यक्तिगत रूप से bzip2 से शुरू करता हूं। मुझे नहीं पता कि बज़िप आउटपुट को सीधे बज़िप 2 इनपुट पर निर्देशित करना संभव है या नहीं। गनज़िप की तुलना में bzip2 कमांड इतनी धीमी है कि यह अपघटन पर है कि यह मेजबान पर मेमोरी और स्वैप स्पेस का उपभोग कर सकता है।

सुधार या सुझाव का स्वागत है। यहाँ मेरा एक लाइनर है:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

इनपुट के लिए धन्यवाद, दो प्रक्रियाओं और इसके निहितार्थ के बीच गति के अंतर के बारे में एक महत्वपूर्ण बिंदु है।
सूंदर -


1

बस कुछ मिनट पहले ऐसा करना था:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

कहां rezipपरिभाषित किया जाएगा:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

वैकल्पिक रूप से, आप इसके -Pसाथ एक विकल्प का उपयोग करके इसे बहु-थ्रेडेड बना सकते हैं xargs, लेकिन उस एक के साथ सावधान रहें। (कम शुरू करो!)

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