क्या तारिंग फ़ाइलें संपीड़न में सुधार कर सकती हैं?


9

एक साथ फ़ाइलों का एक गुच्छा टारिंग मानक उपकरण, जैसे gzip, bzip2, xz के साथ संपीड़न में सुधार कर सकता है?

मैंने लंबे समय से यह मामला सोचा है लेकिन कभी भी इसका परीक्षण नहीं किया। यदि हमारे पास यादृच्छिक बाइट्स की समान 20Mb फ़ाइल की 2 प्रतियाँ एक साथ तारांकित हैं, तो एक चतुर संपीडन प्रोग्राम जो यह महसूस करता है कि पूरे टारबॉल को लगभग 20Mb तक संकुचित कर सकता है।

मैंने अभी इस प्रयोग को gzip, bzip2 और xz को संपीड़ित करने के लिए 1) यादृच्छिक बाइट्स की एक फ़ाइल, 2) उस फ़ाइल की दो प्रतियों का एक तारबॉल, और 3) उस फ़ाइल की दो प्रतियों की एक बिल्ली का उपयोग करने की कोशिश की। सभी मामलों में संपीड़न ने फ़ाइल का आकार कम नहीं किया। यह केस 1 के लिए अपेक्षित है, लेकिन केस 2 और 3 के लिए इष्टतम परिणाम यह है कि 40Mb फाइल लगभग 20Mb तक सिकुड़ सकती है। यह देखने के लिए एक संपीड़न कार्यक्रम के लिए एक कठिन अंतर्दृष्टि है, खासकर क्योंकि अतिरेक दूर है, इसलिए मैं एक आदर्श परिणाम की उम्मीद नहीं करूंगा, लेकिन मुझे अभी भी लगा था कि कुछ संपीड़न होगा।

परीक्षा:

dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*

परिणाम:

20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1]   Done                    gzip -k random*
[2]-  Done                    bzip2 -k random*
[3]+  Done                    xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz

क्या यह आमतौर पर मुझे उम्मीद करनी चाहिए?

क्या यहां संपीड़न में सुधार करने का एक तरीका है?


आपके परीक्षण के मामले खराब उदाहरण हैं। ~ 100 (वास्तविक) टेक्स्ट फ़ाइलों की निर्देशिका के साथ अपना परीक्षण करने का प्रयास करें।
lcd047

यह एक बुरा उदाहरण क्यों है? हमें पता है कि क्या उम्मीद की जानी चाहिए। एक यादृच्छिक फ़ाइल को संपीड़ित नहीं किया जा सकता है और एक यादृच्छिक फ़ाइल के 2 को आधे में संकुचित किया जा सकता है।
प्रिक्सोलिटिक

"यादृच्छिक" फ़ाइल सामग्री एक समस्या है। वे अक्षम हैं। एक बेहतर विचार प्राप्त करने के लिए दो अलग-अलग बड़ी फ़ाइलों का उपयोग करें। यहां एक संबंधित विचार "सामान्यीकृत संपीड़न अंतर" है। आप ims.cuhk.edu.hk/~cis/2005.4/01.pdf पर एक नज़र डाल सकते हैं, यह देखने के लिए कि इस तरह के परीक्षण करने से आपको किस तरह की समस्याएं आ सकती हैं।
ब्रूस एडगर

जवाबों:


11

आप कंप्रेसर के "ब्लॉक आकार" के खिलाफ हैं। अधिकांश संपीड़न प्रोग्राम इनपुट को ब्लॉक में तोड़ते हैं और प्रत्येक ब्लॉक को संपीड़ित करते हैं। ऐसा प्रतीत होता है कि bzip ब्लॉक का आकार केवल 900K तक जाता है, इसलिए इसे दोहराने के लिए 900K बाइट्स से अधिक समय लेने वाला कोई भी पैटर्न दिखाई नहीं देगा।

http://www.bzip.org/1.0.3/html/memory-management.html

gzip 32K ब्लॉक का उपयोग करता प्रतीत होता है।

Xz के साथ आप भाग्य में हैं! आदमी पृष्ठ से:

   Preset   DictSize   CompCPU   CompMem   DecMem
     -0     256 KiB       0        3 MiB    1 MiB
     -1       1 MiB       1        9 MiB    2 MiB
     -2       2 MiB       2       17 MiB    3 MiB
     -3       4 MiB       3       32 MiB    5 MiB
     -4       4 MiB       4       48 MiB    5 MiB
     -5       8 MiB       5       94 MiB    9 MiB
     -6       8 MiB       6       94 MiB    9 MiB
     -7      16 MiB       6      186 MiB   17 MiB
     -8      32 MiB       6      370 MiB   33 MiB
     -9      64 MiB       6      674 MiB   65 MiB

तो "xz -8" 32MB पैटर्न और "xz -9" 64MB पैटर्न तक मिलेगा। लेकिन सावधान रहें कि संपीड़न (और डिकम्प्रेस करने के लिए) को प्रदर्शन करने के लिए कितना रैम चाहिए ...


1
हां, xz -8 परीक्षण में टैरबॉल और बिल्ली को 21M में सिकोड़ता है।
प्रिक्सॉलिटिक

1
वहाँ सिर्फ ब्लॉक आकार की तुलना में अधिक है। लेकिन पूरी कहानी कुछ ऐसी नहीं है जिसे एसई पर कुछ पैराग्राफ में समझाया जा सकता है।
lcd047

1
@Praxeolitic डेटा संपीड़न पर एक कोर्स मदद कर सकता है।
lcd047

1
@ lcd047 कम्प्रेशन एक बहुत बड़ा विषय है लेकिन यहाँ सवाल बस यही था कि "यह कंप्रेस क्यों नहीं हुआ" और इसका जवाब है क्योंकि कंप्रेशन रिपीटिंग पैटर्न पर काम करता है और जिस पैटर्न को वह ढूंढना चाहता था वह किसी भी टूल की तुलना में अधिक समय तक नहीं लगता था।
मृत्युंजय २ d

1
मैं यह भी जानना उपयोगी समझता हूं कि अधिकांश कमांड लाइन कम्प्रेसर पर "-9" का अर्थ "पैटर्न खोजने के लिए कठिन प्रयास" नहीं है, इसका मतलब है "बड़े पैटर्न रिक्त स्थान पर विचार करें"।
22

2

आपके द्वारा चुनी गई यादृच्छिक फ़ाइल सामग्री एक अच्छा उदाहरण नहीं है - संपीड़ित टर्फाइल मूल से बड़ा होगा । आप पहले से कंप्रेसिंग प्रारूपों (उदाहरण के लिए कई छवि / ऑडियो / वीडियो प्रारूप) में फ़ाइलों के साथ देखेंगे।

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



@ कोस यह एक प्रयुक्त एल्गोरिथम और डेटा पर निर्भर करता है। उद्धृत 33% एक बहुत ही विशेष मामले के लिए हैं। Gzip और bzip2 के साथ, मैंने 1000 बेतरतीब ढंग से उत्पन्न 1MB फ़ाइलों के लिए मापा, हर फ़ाइल पर <1% की वृद्धि ।
जोफेल

2

जैसा कि पहले ही संकेत दिया गया है:

  1. यादृच्छिक फ़ाइलों का उपयोग करना अच्छा नहीं है क्योंकि उनमें पहले से ही अधिकतम "सूचना एन्ट्रॉपी" शामिल है, इसलिए वे संपीड़ित नहीं करेंगे;
  2. निष्पक्ष तुलना के लिए आपको बहुत सारी फाइलें पैक करने की आवश्यकता है ।

एक बेहतर परीक्षण मामला यह हो सकता है:

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(नोट: उम्मीद के तहत कोई आरोह नहीं है /usr!)

आप tar -jcfइसके बजाय xz संपीड़न के लिए उपयोग कर सकते हैं ।

अब यदि test2.tar.gztest1.tar.gz से छोटा है, तो परीक्षण सफल होता है (यानी फ़ाइलों को टारगेट करना तब कंप्रेस करना बेहतर होता है फिर टाररिंग से)। मेरा अनुमान है कि यह फाइलों के एक बहुत (यानी हजारों) के लिए होगा। नकारात्मक पक्ष यह है कि संभवतः इसे निष्पादित करने में अधिक समय लगेगा, साथ ही बहुत अधिक डिस्क स्थान की आवश्यकता होगी, क्योंकि इसे पूरी टार फाइल को पहले बनाना होगा और फिर इसे संपीड़ित करना होगा। इसीलिए अक्सर 1 विधि का उपयोग किया जाता है, क्योंकि यह मक्खी के प्रत्येक फ़ाइल को संपीड़ित करता है, भले ही यह छोटा टारबॉल न हो।

उदाहरण के लिए, हमारे ऑफ़सेट बैकअप में हम आम तौर पर 2TB के बारे में कुल 4,000,000 फ़ाइलों का बैकअप ले रहे हैं। तो पहली विधि बहुत जल्दी है और डिस्क की अतिरिक्त 2TB की आवश्यकता नहीं है।


संग्रह (यानी टार) को -zसंपीड़ित नहीं करता है ? आमतौर पर आउटपुट फ़ाइल नाम के साथ .tar.gz इस पर जोर देने के लिए समाप्त होता है। czf
जरी कीनानलेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.