सवाल ज़िप एक ही सामग्री के साथ एकाधिक फ़ाइलों की तुलना में एकल फ़ाइल को छोटा करने में सक्षम क्यों है?


मान लीजिए कि मेरे पास 10,000 एक्सएमएल फाइलें हैं। अब मान लीजिए कि मैं उन्हें एक दोस्त को भेजना चाहता हूं। उन्हें भेजने से पहले, मैं उन्हें संपीड़ित करना चाहता हूं।

विधि 1: उन्हें संपीड़ित न करें

परिणाम:

Resulting Size: 62 MB
Percent of initial size: 100%

विधि 2: प्रत्येक फ़ाइल को ज़िप करें और उसे 10,000 xml फ़ाइलें भेजें

कमान:

for x in $(ls -1) ;  do   echo $x ; zip "$x.zip" $x ; done

परिणाम:

Resulting Size: 13 MB
Percent of initial size: 20%

विधि 3: 10,000 xml फ़ाइलों वाले एक ज़िप को बनाएं

कमान:

zip all.zip $(ls -1)

परिणाम:

Resulting Size: 12 MB
Percent of initial size: 19%

विधि 4: फ़ाइलों को एक फ़ाइल में संयोजित करें और इसे ज़िप करें

कमान:

cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt

परिणाम:

Resulting Size: 2 MB
Percent of initial size: 3%

प्रशन:

  • जब मैं सिर्फ एक फ़ाइल को ज़िप कर रहा हूं तो मुझे ऐसे नाटकीय रूप से बेहतर परिणाम क्यों मिलते हैं?
  • मैं विधि 2 की तुलना में विधि 3 का उपयोग करके काफी बेहतर परिणाम प्राप्त करने की उम्मीद कर रहा था, लेकिन नहीं। क्यूं कर?
  • क्या यह व्यवहार विशिष्ट है zip? अगर मैंने प्रयोग करने की कोशिश की gzip क्या मुझे अलग-अलग परिणाम मिलेंगे?

अतिरिक्त जानकारी:

$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.

Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.

Zip special compilation options:
    USE_EF_UT_TIME       (store Universal Time)
    SYMLINK_SUPPORT      (symbolic links supported)
    LARGE_FILE_SUPPORT   (can read and write large files on file system)
    ZIP64_SUPPORT        (use Zip64 to store large files in archives)
    UNICODE_SUPPORT      (store and read UTF-8 Unicode paths)
    STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
    UIDGID_NOT_16BIT     (old Unix 16-bit UID/GID extra field not used)
    [encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)

संपादित करें: मेटा डेटा

एक जवाब से पता चलता है कि अंतर सिस्टम मेटा डेटा है जो ज़िप में संग्रहीत है। मुझे नहीं लगता कि यह मामला हो सकता है। परीक्षण करने के लिए, मैंने निम्नलिखित किया:

for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)

परिणामस्वरूप ज़िप 1.4 एमबी है। इसका मतलब है कि अभी भी ~ 10 एमबी अस्पष्ट जगह है।


121
2017-12-14 17:30


मूल


अगर मुझे गलत नहीं लगता है, तो यह घटना है जो लोगों को बनाने का कारण बनती है .tar.gz पूरी निर्देशिका को सिर्फ ज़िप करने के विरोध में। - corsiKa
ए इसी तरह का सवाल पहले से ही पूछा गया था, टीएल; ठोस 7zip अभिलेखागार का उपयोग करें। - Dmitry Grigoryev
@sixtyfootersdude कुछ उत्तरों को सत्यापित करने के लिए एक परीक्षण के रूप में, क्या आप विधि 3 में उत्पादित ज़िप को ज़िप करने का प्रयास कर सकते हैं? मुझे संदेह है कि यह फ़ाइल आकार को विधि 4 के बराबर कुछ कम कर देगा। - Travis
के बजाय $(ls -1), महज प्रयोग करें *: for x in *; zip all.zip * - muru
यदि आप ज़िप के साथ ठोस संपीड़न करना चाहते हैं, तो यहां एक वर्कअराउंड है: सबसे पहले, एक बनाएं असम्पीडित ज़िप में आपकी सभी फाइलें हैं। फिर, उस ज़िप को एक और संपीड़ित ज़िप के अंदर रखें। - user20574


जवाब:


संपीड़न करते समय ज़िप प्रत्येक फ़ाइल की सामग्री को अलग से व्यवहार करता है। प्रत्येक फाइल में अपनी संपीड़ित धारा होगी। संपीड़न एल्गोरिदम के भीतर समर्थन है (आमतौर पर हवा निकालना) बार-बार खंडों की पहचान करने के लिए। हालांकि, फ़ाइलों के बीच अनावश्यकता खोजने के लिए ज़िप में कोई समर्थन नहीं है।

यही कारण है कि जब सामग्री एकाधिक फ़ाइलों में होती है तो बहुत अधिक जगह होती है: यह फ़ाइल में एक ही संपीड़ित स्ट्रीम को कई बार डाल रहा है।


126
2017-12-14 19:24



यह भी है कि कुछ संपीड़न उपकरण आपको फ़ाइलों को अलग से या एक इकाई के रूप में संपीड़ित करने का विकल्प देते हैं। (हालांकि आम तौर पर इसका मतलब यह भी है कि आपको अधिक से अधिक संग्रह को कम करना होगा, अन्यथा यदि आप इसमें केवल एक फ़ाइल देखना चाहते हैं।) - JAB
@ जेएबी: 7z और रार जैसे संपीड़न उपकरण बड़े संपीड़न धाराओं में पूंछ के लिए कई फाइलों को पैक करने के लिए "ठोस" संग्रह शब्द का उपयोग करते हैं। 64 एमआईबी जैसे मध्यम आकार के आकार के साथ, एक फ़ाइल में यादृच्छिक पहुंच के लिए संपीड़न ब्लॉक की शुरुआत से डेटा के 64 एमआईबीबी को डिकंप्रेस करने की आवश्यकता हो सकती है। आप यादृच्छिक-पहुंच और क्रॉस-फ़ाइल रिडंडेंसी खोजने के बीच एक सभ्य व्यापार प्राप्त कर सकते हैं। 7z अधिक प्रभावी (लेकिन संपीड़ित करने के लिए धीमे) LZMA संपीड़न योजना का उपयोग कर सकते हैं, जो ज़िप पर एक और फायदा है। - Peter Cordes
क्या आप यह कह रहे हैं there is no support in Zip to find redundancy between files ज़िप फ़ाइल विनिर्देश में है? - sixtyfootersdude
@sixtyfootersdude कई संपीड़न एल्गोरिदम, जैसे DEFLATE, स्ट्रीम के रूप में कार्य करते हैं। स्ट्रीम के एक हिस्से को डिकंप्रेस करने के लिए पर्याप्त जानकारी पुनर्प्राप्त करने के लिए, आपको उस बिंदु तक पूरी स्ट्रीम को संसाधित करने की आवश्यकता है। यदि उन्होंने फ़ाइलों के बीच अनावश्यकता खोजने की कोशिश की है, तो आपको अंतिम 1000 तक पहुंचने के लिए सभी 1000 फ़ाइलों को डिकंप्रेस करना होगा। यह आम तौर पर कैसे काम करता है, वास्तव में tgz काम करता है। हालांकि, ज़िप को व्यक्तिगत फ़ाइलों को निकालने के लिए डिज़ाइन किया गया था। tgz को अधिक या कुछ भी नहीं होने के लिए डिज़ाइन किया गया है - Cort Ammon
@sixtyfootersdude - यह सही है। कॉर्ट को पैराफ्रेश करने के लिए: pkzip चश्मा काम करने वाली क्रॉस-फ़ाइल का समर्थन नहीं करते हैं। यदि उन्होंने एक फ़ाइल निकालने के बाद पूरे संग्रह (और प्रत्येक फ़ाइल) निकालने की आवश्यकता हो सकती है। - James Snell


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

सरलीकृत, यदि आप एक फ़ाइल को संपीड़ित करते हैं, तो शब्दकोष (लघु) कोड (लंबा) पैटर्न के लिए शब्दकोष आवश्यक रूप से प्रत्येक परिणामी ज़िप फ़ाइल में निहित है; यदि आप एक लंबी फ़ाइल ज़िप करते हैं, तो शब्दकोश 'पुन: उपयोग' होता है और सभी सामग्री में और भी प्रभावी होता है।

यदि आपकी फाइलें थोड़ी समान हैं (जैसा कि पाठ हमेशा होता है), 'शब्दकोश' का पुन: उपयोग बहुत प्रभावी हो जाता है, और नतीजा बहुत छोटा कुल ज़िप होता है।


47
2017-12-14 18:48



ज़िप संग्रह और संपीड़न दोनों करता है। क्या इसका मतलब यह है कि ज़िप प्रत्येक फ़ाइल को व्यक्तिगत रूप से संपीड़ित करता है, भले ही वे सभी एक ही ज़िप-फ़ाइल में समाप्त हो जाएं? - gerrit
यह कल्पना करना है कि आप एक फ़ाइल को हटा दें, आप नहीं चाहते हैं कि यह एक नया आधा घंटा फिर से एक नए 'शब्दकोश' के साथ फिर से संपीड़ित करे। - यह भी, मान लीजिए कि विभिन्न फाइलों को बहुत अलग 'शब्दकोश' की आवश्यकता है। - Aganju
मुझे नहीं लगता कि इसे क्यों करना है। यूनिक्स टूल्स के साथ, मैं पहले टैर के साथ एक फाइल संग्रहित करता हूं, फिर इसे gzip / bz2 / lzma के साथ संपीड़ित करता हूं। संपीड़न एल्गोरिदम परवाह नहीं है कि संग्रह में कितनी फ़ाइलें एन्कोड की गई हैं। साथ ही, संकुचित संग्रह से एक फ़ाइल को वास्तव में कितना आम है? मुझे नहीं लगता कि मैंने कभी ऐसा किया है। - gerrit
मैं असहमत नहीं हूं, और यह शायद एक अच्छा तरीका है। मैंने ज़िप डिजाइन या लिख ​​नहीं लिया था। मैंने अभी कहा कि यह क्या करता है ... - Aganju
@gerrit यह अपनी खुद की समस्या है। ज़िप को संग्रह में किसी भी फ़ाइल को त्वरित रूप से एक्सेस करने की अनुमति देने के लिए डिज़ाइन किया गया है - एक 100 जीबी यूएचए संग्रह से एक फ़ाइल को अनपॅक करने का प्रयास करें और आप देखेंगे कि उन्होंने इस तरह क्यों चुना है। यह भी संलग्न करने के लिए डिज़ाइन किया गया है - आपके पास बैकअप ज़िप हो सकता है और आवश्यकतानुसार फ़ाइलों को जोड़ना (या प्रतिस्थापित करना) रखना है। अभिलेखागार का उपयोग करते समय यह सब एक बड़ी मदद है। व्यापार-बंद यह है कि यदि आप उन फ़ाइलों को संपीड़ित कर रहे हैं जो बहुत समान हैं (जो है नहीं यह सब आम है), यह संग्रह आकार को कम करने के लिए समानताओं का फायदा नहीं उठा सकता है। - Luaan


ज़िप में प्रत्येक फ़ाइल को अलग से संपीड़ित किया जाता है। विपरीत 'ठोस संपीड़न' है, जो फाइलें एक साथ संपीड़ित होती हैं। 7-ज़िप और रार डिफ़ॉल्ट रूप से ठोस संपीड़न का उपयोग करते हैं। Gzip और Bzip2 एकाधिक फ़ाइलों को संपीड़ित नहीं कर सकता है इसलिए तार का उपयोग पहले किया जाता है, ठोस संपीड़न के समान प्रभाव होता है।

चूंकि एक्सएमएल फ़ाइल में समान संरचना होती है और संभवतः समान सामग्री होती है यदि फ़ाइलों को एक साथ संपीड़ित किया जाता है तो संपीड़न अधिक होगा।

उदाहरण के लिए यदि फ़ाइल में स्ट्रिंग है "<content><element name=" और कंप्रेसर को पहले से ही यह पाया गया है कि दूसरी फाइल में स्ट्रिंग इसे पिछले मैच में एक छोटे सूचक के साथ बदल देगी, अगर कंप्रेसर 'ठोस संपीड़न' का उपयोग नहीं करता है तो फ़ाइल में स्ट्रिंग के पहले ओकुरेंस को शाब्दिक के रूप में रिकॉर्ड किया जाएगा बड़ा है


42
2017-12-14 20:02





ज़िप फ़ाइल की सामग्री को संग्रहीत नहीं करता है, यह फ़ाइल मेटाडेटा को मालिकाना आईडी आईडी, अनुमतियां, निर्माण और संशोधन समय आदि जैसे स्टोर करता है। यदि आपके पास एक फ़ाइल है तो आपके पास मेटाडेटा का एक सेट है; यदि आपके पास 10,000 फाइलें हैं तो आपके पास मेटाडेटा के 10,000 सेट हैं।


9
2017-12-14 17:38



अच्छा बिंदु, लेकिन सिस्टम मेटा डेटा सिर्फ 1.4 एमबी स्पेस ले रहा है। मेरा संपादन देखें। - sixtyfootersdude
मैं ज़िप एल्गोरिदम से परिचित नहीं हूं, लेकिन मेटाडेटा केवल फ़ाइल की जानकारी नहीं है, बल्कि आकार और एक शब्दकोश जैसी चीजें हैं, संभवतः पात्रों के वितरण पर कुछ जानकारी। गैर-खाली टेक्स्ट फ़ाइल पर एक शब्दकोश गैर-शून्य होगा। शायद यही कारण है कि आप अपनी खाली फ़ाइलों की तुलना में मेटाडेटा को अपनी एक्सएमएल फाइलों में बड़ा क्यों देखते हैं। - Ben Richards
यह मेरा पहला विचार था। ज़िप-फ़ाइल शीर्षलेख जानकारी - WernerCD
यह केवल 2 और 3 के बीच अंतर बताता है - 4 नहीं। - Luaan
@Luaan नहीं, 2 और 3 दोनों में मेटाडेटा सभी 10,000 फ़ाइलों के लिए ज़िप फ़ाइल या फ़ाइलों में शामिल है, इसलिए कुल फ़ाइल आकार लगभग एक ही आकार है। 4 में, केवल एक फ़ाइल के लिए मेटाडेटा है, और ज़िप फ़ाइल बहुत छोटी है। - Mike Scott


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

विंडोज़ में टैर परिवार का विस्तार करने के लिए 7-ज़िप जैसे फ्री टूल्स की सर्वव्यापीता के साथ, लिनक्स, ओएस एक्स और बीएसडी के रूप में .tar.gz या .tar.bz, आदि का उपयोग न करने का वास्तव में कोई कारण नहीं है। देशी उपकरण उन्हें कुशल बनाने के लिए।


6
2017-12-15 15:50



gzip और bzip2 और भी बदतर हो सकते हैं क्योंकि उन्हें दिमाग में संपीड़ित धाराओं के साथ डिज़ाइन किया गया है, इसलिए उन्हें संकुचित करने के लिए सभी डेटा को संपीड़ित करने से पहले संपीड़ित डेटा आउटपुट करना प्रारंभ करना होगा। - rackandboneman
@rackandboneman: यह वह ट्रेडऑफ है जिसे आप संपीड़न समय पर उपयोग की जाने वाली स्मृति की मात्रा से बड़ी फ़ाइलों को संपीड़ित करते समय करना चाहते हैं। (और, वैश्विक स्तर पर इष्टतम कुछ भी खोजने के लिए आवश्यक CPU समय की मात्रा बहुत बड़ी होगी।) एक विशाल संपीड़न शब्दकोश भी आवश्यक स्मृति को बढ़ा सकता है विसंपीड़न। यह एलजेएमए के लिए एक विकल्प है (xz / 7-ज़िप)। वैसे भी, अनुकूलक शब्दकोश एक बार दिखाई देने के बाद पैटर्न पर उठा सकते हैं। ऐसा नहीं है कि यह पहले 32k के आधार पर एक स्थिर कोडिंग सिस्टम बनाता है। यही कारण है कि gzip चूसना नहीं है। - Peter Cordes


ज़िप संपीड़न प्रारूप प्रत्येक फ़ाइल को अलग-अलग स्टोर करता है और संपीड़ित करता है। यह फ़ाइलों के बीच दोहराव का लाभ नहीं लेता है, केवल एक फ़ाइल के भीतर।

फ़ाइल को संयोजित करने से ज़िप सभी फ़ाइलों में पुनरावृत्ति का लाभ उठाने की अनुमति देता है, जिसके परिणामस्वरूप भारी संपीड़न होता है।

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


5
2017-12-15 01:19



यह पहले से 5 घंटे पहले पोस्ट किए गए शीर्ष 3 उत्तरों में से एक से अलग कैसे है? - Xen2050
@ ज़ेन 2050 बहुत अंतर नहीं, मैंने सोचा कि मैं इसे और अधिक स्पष्ट रूप से समझा सकता हूं। - BonsaiOak
@ बोन्साईओक - फिर सही उत्तर पर एक टिप्पणी जोड़ें या संपादित करें यदि आपके पास पर्याप्त प्रतिनिधि है। यदि नहीं, लेकिन आपकी टिप्पणी स्पष्टता जोड़ती है, तो कोई और इसे उठा सकता है और फिर भी पोस्ट को संपादित कर सकता है। - AdamV
@AdamV मैं आपका बिंदु देखता हूं। मेरा जवाब वर्तमान में कोई उपयोगी जानकारी नहीं जोड़ता है, हालांकि जब मैंने इसे लिखा था तो तर्कसंगत रूप से किया गया था। पहले जवाब के तहत पहले से ही उचित टिप्पणियां हैं इसलिए मुझे उन्हें जोड़ने में बिंदु नहीं दिख रहा है, या तो। क्या आप कह रहे हैं कि मुझे अपना जवाब बंद करना चाहिए? इसे खोलने में क्या नुकसान है? - BonsaiOak


मेटाडाटा माइक स्कॉट के बगल में संपीड़न एल्गोरिदम में ओवरहेड भी है।

व्यक्तिगत छोटी फ़ाइलों के समूह को संपीड़ित करते समय आपको बहुत भाग्यशाली होना होगा ताकि उन्हें संपीड़ित करने में सक्षम हो कि यह एक संपीड़न ब्लॉक भरने के लिए होता है। एक एकल मोनोलिथिक ब्लॉक को संपीड़ित करते समय सिस्टम अलग-अलग फ़ाइलों की 'सीमाएं' (बेहतर शब्द की कमी के लिए) को अनदेखा कर, अपने एल्गोरिदम में डेटा स्ट्रीम करना जारी रख सकता है।

एएससीआईआई भी उच्च संपीड़न कारक के लिए जाना जाता है। प्लस एक्सएमएल अक्सर मेटाडेटा को डेटा का एक बड़ा हिस्सा बनाते हुए बहुत दोहराया जाता है जिसे एक्सएमएल सामग्री के रूप में आसानी से संपीड़ित नहीं किया जा सकता है।

आखिरकार, अगर मेमोरी सही परोसती है, तो ज़िप डिक्शनरी एन्कोडिंग की तरह कुछ उपयोग करता है, जो एएससीआई फाइलों पर विशेष रूप से प्रभावी है और एक्सएमएल पर भी उनकी पुनरावृत्ति के कारण

डेटा संपीड़न समझाया गया: http://mattmahoney.net/dc/dce.html


4
2017-12-14 18:02





इस एक्सएमएल पर विचार करें:

<root>
  <element id="1" />
  <element id="2" /> 
  <other id="3" />
  ...
</root>

एक एक्सएमएल की एक बहुत ही दोहराव वाली संरचना है, ज़िप एक शब्दकोश बनाने के लिए उन दोहराव का लाभ उठाता है पैटर्न अधिक घटनाएं होती हैं और फिर, संपीड़न करते समय, अधिक बार-बार स्टोर करने के लिए कम बिट्स का उपयोग करती है पैटर्न और कम बिट्स स्टोर करने के लिए और अधिक बिट्स पैटर्न

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

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

अंततः संपीड़न एल्गोरिदम को सर्वोत्तम बार-बार पैटर्न वितरण मिला है।


3
2017-12-16 01:27