7z में संपीड़न विधियों का संयोजन वास्तव में क्या करता है?


11

7z कमांड-लाइन टूल आपको कई संपीड़न तरीके निर्दिष्ट करने देता है , जैसे:

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

सभी तरीके किसी न किसी तरह से उपयोग किए जाते हैं, या कम से कम मेटाडेटा में निर्दिष्ट होते हैं:

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

यह तीनों विधियों के माध्यम से फ़ाइल को चलाने के लिए प्रकट नहीं होता है, सबसे अच्छा उठाता है। बल्कि, यह हमेशा स्पष्ट रूप से पहले उठाता है, क्योंकि विधि के क्रम को बदलने से फ़ाइल का आकार काफी प्रभावित होता है।

यहां तक ​​कि अगर मैं एक एक्सएमएल फ़ाइल (पीपीएमडी सबसे अच्छी संपीड़न पैदा करता है) और एक बाइनरी फ़ाइल (एलजेडएम 2 करता है) जैसी कई फाइलें जोड़ता हूं, तो भी यह दोनों फाइलों के लिए सभी तरीकों को सूचीबद्ध करता है, और प्रति फ़ाइल गतिशील रूप से स्विच नहीं करता है।

वास्तव में, प्रलेखन विशेष रूप से कहता है कि "आप किसी भी संख्या में विधियों का उपयोग कर सकते हैं।", लेकिन यह नहीं कहता कि कहां है

मैं जो प्राप्त करने की कोशिश कर रहा हूं वह प्रति-फ़ाइल "कई तरीकों को आज़माएं, जो भी सबसे अच्छा हो" संग्रह करें। मैं निश्चित रूप से थोड़ा स्क्रिप्टिंग के साथ मैन्युअल रूप से इसे प्राप्त कर सकता हूं, लेकिन संभवतः, संपीड़न विधियों का पीछा करते हुए वास्तव में ऐसा करना चाहिए?


संपीड़न विधियों के क्रम को बदलने से संकुचित आकार को बदलना चाहिए , भले ही सभी तरीकों को क्रम में लागू किया गया हो। अधिकांश संपीड़न आमतौर पर लागू पहले विधि से आता है। उस परिणाम से आम तौर पर उच्च एन्ट्रॉपी होती है, इसलिए आगे संपीड़ित करना मुश्किल है। ट्रांसफ़ॉर्म के अपवाद हैं जो स्वयं डेटा को संपीड़ित करने की अपेक्षा नहीं करते हैं, लेकिन जो इसे अधिक संपीड़ित करने के लिए एन्कोड करते हैं - जैसे अनुक्रम 1, 2, 3, 4, 5 में मूल्यों का पुनरावृत्ति नहीं है, लेकिन मतभेदों की पुनरावृत्ति है, इसलिए एक डेल्टा ट्रांसफ़ॉर्मेंस कम्प्रेसिबिलिटी में सुधार करता है। इस बारे में डेनियल बी का जवाब है।
स्टीव314

मैं वास्तव में नहीं जानता कि 7zip क्या करता है, हालांकि - सिर्फ आपके "विधि के क्रम को बदलने के रूप में फ़ाइल आकार को महत्वपूर्ण रूप से प्रभावित करता है" तर्क पर टिप्पणी करता है।
स्टीव314

जवाबों:


5

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

-mN=Xमुख्य रूप से फिल्टर निर्दिष्ट करने के लिए (विंडोज़ मदद फ़ाइल से लिया गया) किया जाता है:

समर्थित फ़िल्टर:

डेल्टा डेल्टा फ़िल्टर ("बाइट्स में डेल्टा ऑफ़सेट सेट करना संभव है। उदाहरण के लिए, 16-बिट स्टीरियो WAV फ़ाइलों को संपीड़ित करने के लिए, आप" 0 = डेल्टा: 4 "सेट कर सकते हैं। डिफ़ॉल्ट डेल्टा ऑफसेट 1. है।")

X86 निष्पादन योग्य के लिए BCJ कनवर्टर

X86 निष्पादक (संस्करण 2) के लिए BCJ2 कनवर्टर ("BCJ2 32-बिट x86 निष्पादक (संस्करण 2) के लिए एक शाखा कनवर्टर है। यह आगे के संपीड़न को बढ़ाने के लिए कुछ शाखा निर्देशों को परिवर्तित करता है।"

एआरएम कनवर्टर एआरएम (थोड़ा एंडियन) के निष्पादन के लिए

ARMT एआरएम अँगूठा (थोड़ा endian) निष्पादनयोग्य के लिए कनवर्टर

IA-64 निष्पादक के लिए IA64 कनवर्टर

पावरपीसी (बड़ा एंडियन) निष्पादनयोग्य के लिए पीपीसी कनवर्टर

SPARC के निष्पादन के लिए SPARC कनवर्टर

इसके अलावा मदद फ़ाइल से, एक उन्नत उदाहरण BCJ2 फ़िल्टर के कई आउटपुट स्ट्रीम का लाभ उठा रहा है:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

* .exe और * .dll फ़ाइलों को संग्रह में संग्रहीत करता है। BCJ2 कनवर्टर, मुख्य आउटपुट स्ट्रीम (s0) के लिए 8 MB डिक्शनरी के साथ LZMA, और BCZ2 के s2 आउटपुट स्ट्रीम के लिए 512 KB डिक्शनरी के साथ LZMA का उपयोग करके संग्रहित करें।


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

2

ऐसा लगता है कि आप किसी अनुक्रम में फ़िल्टर लागू कर सकते हैं।

पिछले साल के इस पोस्ट में एक अच्छी व्याख्या है:

7-जिप के एम स्विच के बाद संख्या का क्या मतलब है?

यदि आप एक से अधिक बार उपयोग कर रहे हैं तो यह संख्या आपको संपीड़न ऑपरेशन का क्रम निर्धारित करने देती है।

यह प्रलेखन से एक उदाहरण है:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

* .exe और *। dll फ़ाइलों को BCJ2 फ़िल्टर, LZMA का उपयोग करके आर्काइव में मुख्य आउटपुट स्ट्रीम (s0) के लिए 32 MB शब्दकोश और LZMA के साथ 512 KB शब्दकोश के साथ s1 और s2 आउटपुट स्ट्रीम BC2 के लिए संग्रहित करता है।

पहला संपीड़न सबसे कम संख्या है, जो शून्य है। इस उदाहरण में, शून्य BCJ2 पर सेट है। फिर एक आता है, जो LZMA है। दो और तीन भी LZMA हैं, लेकिन वे विभिन्न डी मापदंडों का उपयोग कर रहे हैं।

-Mb विकल्प का उपयोग आउटपुट को एक संपीड़न से दूसरे के इनपुट में "बाइंड" करने के लिए किया जाता है। इस उदाहरण में, बीसीजे 2 में एक इनपुट और चार आउटपुट हैं। आउटपुट शून्य कंप्रेशन नंबर एक पर जा रहा है। आउटपुट एक कंप्रेशन नंबर दो में जा रहा है। आउटपुट दो कंप्रेशन नंबर तीन पर जाता है। आउटपुट तीन बाध्य नहीं है (क्योंकि इसे फिर से संपीड़ित करने की आवश्यकता नहीं है)।

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