سؤال لماذا يستطيع Zip ضغط ملف واحد أصغر من ملفات متعددة بنفس المحتوى؟


افترض أن لدي 10،000 ملفات XML. افترض الآن أنني أريد إرسالهم إلى صديق. قبل إرسالها ، أود ضغطها.

الطريقة الأولى: لا ضغطها

النتائج:

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

الطريقة الثانية: قم بتنسيق كل ملف وإرساله إلى ١٠٠٠٠ ملف xml

أمر:

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

النتائج:

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

الطريقة الثالثة: إنشاء ملف مضغوط واحد يحتوي على ملفات xml 10،000

أمر:

zip all.zip $(ls -1)

النتائج:

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

الطريقة الرابعة: وصل الملفات إلى ملف واحد ثم قم بضغطها

أمر:

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

النتائج:

Resulting Size: 2 MB
Percent of initial size: 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
ا سؤال مماثل تم طرحه بالفعل ، tl ؛ الدكتور استخدام أرشيفات 7ZIP الصلبة. - Dmitry Grigoryev
sixtyfootersdude كاختبار للتحقق من صحة بعض الإجابات ، هل يمكنك محاولة ضغط الرمز البريدي الناتج في الطريقة الثالثة؟ أظن أن هذا سيقلل من حجم الملف إلى شيء مماثل للطريقة الرابعة. - Travis
بدلا من $(ls -1)فقط استخدم *: for x in *. zip all.zip * - muru
إذا كنت تريد إجراء ضغط ثابت باستخدام ZIP ، فإليك طريقة بديلة: أولاً ، قم بإنشاء غير مضغوط الرمز البريدي يحتوي على جميع الملفات الخاصة بك. ثم ، ضع ذلك الرمز البريدي داخل ZIP مضغوط آخر. - user20574


الأجوبة:


يعامل الرمز محتويات كل ملف على حدة عند الضغط. سيكون لكل ملف تدفق مضغوط خاص به. يوجد دعم داخل خوارزمية الضغط (عادةً انكماش) لتحديد الأقسام المتكررة. ومع ذلك ، لا يوجد دعم في Zip للعثور على تكرار بين الملفات.

هذا هو سبب وجود مساحة إضافية كبيرة عندما يكون المحتوى في ملفات متعددة: فهو يضع نفس التدفق المضغوط في الملف عدة مرات.


126
2017-12-14 19:24



هذا هو السبب أيضًا في أن بعض أدوات الضغط تمنحك خيار ضغط الملفات بشكل منفصل أو ككيان واحد. (على الرغم من أن هذا يعني أيضًا أنه يجب عليك فك ضغط الأرشيف أكثر من غيرك إذا كنت ترغب في عرض ملف واحد فقط فيه). - JAB
JAB: أدوات الضغط مثل 7z و rar تستخدم أرشيف المصطلح "الصلبة" لتعبئة ملفات متعددة من الرأس إلى الذيل في تدفقات انضغاطية أكبر. مع حجم قطعة معتدلة مثل 64MiB ، قد يتطلب الوصول العشوائي لملف واحد إلغاء ضغط يصل إلى 64 ميغا بايت من البيانات من بداية كتلة الضغط التي في. يمكنك الحصول على مقايضة لائقة بين الوصول العشوائي والعثور على التكرار عبر الملفات. يمكن استخدام 7z نظام ضغط LZMA أكثر فعالية (لكن أبطأ إلى ضغط) ، وهو ميزة أخرى عبر zip. - Peter Cordes
هل انت تقول هذا there is no support in Zip to find redundancy between files في مواصفات ملف zip؟ - sixtyfootersdude
sixtyfootersdude العديد من خوارزميات الضغط ، مثل DEFLATE ، تعمل كتيار. لاسترداد معلومات كافية لفك ضغط جزء من الدفق ، تحتاج إلى معالجة البث بالكامل إلى هذه النقطة. إذا حاولوا العثور على تكرار بين الملفات ، فستضطر إلى فك ضغط جميع الملفات 1000 من أجل الوصول إلى آخر الملفات. هذا عادةً ما يعمل tgz ، في الواقع. ومع ذلك ، فقد تم تصميم الرمز البريدي لتمكنك من استخراج الملفات الفردية. تم تصميم tgz لتكون أكثر كل شيء أو لا شيء - Cort Ammon
sixtyfootersdude - هذا صحيح. لإعادة صياغة Cort: لا تدعم مواصفات pkzip العمل عبر الملف. إذا فعلوا ذلك ، فقد يتطلب استخراج ملف واحد استخراج الأرشيف بالكامل (وكل ملف). - James Snell


يعتمد ضغط ZIP على الأنماط المتكررة في البيانات المراد ضغطها ، ويحسن الضغط كلما كان الملف أطول ، حيث يمكن العثور على أنماط أكثر وأطول واستخدامها.

مبسطة ، إذا ضغطت ملفًا واحدًا ، فإن القاموس الذي يرسم أكواد (قصيرة) إلى أنماط (أطول) موجود بالضرورة في كل ملف مضغوط ناتج ؛ إذا قمت بضغط ملف طويل واحد ، فإن القاموس "يعاد استخدامه" وينمو أكثر فعالية في جميع المحتويات.

إذا كانت ملفاتك متشابهة قليلاً (مثل النص دائمًا) ، فإن إعادة استخدام "القاموس" تصبح فعالة للغاية ، والنتيجة هي zip إجمالي أصغر بكثير.


47
2017-12-14 18:48



ZIP يقوم بالأرشفة والضغط على حد سواء. هل يعني ذلك أن ZIP يضغط كل ملف على حدة ، حتى إذا انتهى به الأمر في نفس الملف ZIP؟ - gerrit
يجب أن تتخيل أنك تقوم بإزالة ملف واحد ، فأنت لا تريد أن تمضي نصف ساعة أخرى في إعادة ضغط الباقي باستخدام "قاموس" جديد. - أيضا ، ربما يفترض أن الملفات المختلفة تحتاج إلى "قواميس" مختلفة جدا. - Aganju
لا أرى السبب في ذلك. باستخدام أدوات Unix ، أرتب ملفًا أولاً باستخدام tar ، ثم ضغطه باستخدام gzip / bz2 / lzma. لا تهتم خوارزمية الضغط بعدد الملفات المشفرة في الأرشيف. وأيضًا ، كم هو شائع إزالة ملف واحد من أرشيف مضغوط؟ لا أعتقد أنني فعلت ذلك. - gerrit
لا أختلف ، وربما تكون هذه طريقة جيدة. لم أصمم أو اكتب ZIP. قلت للتو ما تفعله ... - Aganju
gerrit لديها مشاكلها الخاصة. تم تصميم Zip للسماح لك بالوصول بسرعة إلى أي ملف في الأرشيف - حاول تفريغ ملف واحد من أرشيف 100 GiB UHA وستعرف لماذا اختاروا هذا الطريق. كما تم تصميمه لإلحاقه - يمكنك الحصول على الرمز البريدي الاحتياطية الخاصة بك والاستمرار في إضافة (أو استبدال) الملفات حسب الحاجة. كل هذا يعد مساعدة كبيرة عند استخدام الأرشيف. المقايضة هي أنه إذا كنت ضغط الملفات التي هي مشابهة جدا (وهو ليس كل ذلك شائع) ، فإنه لا يمكن استغلال أوجه التشابه لخفض حجم الأرشيف. - Luaan


في Zip يتم ضغط كل ملف على حدة. والعكس هو "الضغط الصلب" ، أي أن الملفات مضغوطة معًا. يستخدم 7-zip و Rar الانضغاط الصلب بشكل افتراضي. لا يمكن لـ Gzip و Bzip2 ضغط ملفات متعددة حتى يتم استخدام القطران أولاً ، مما يؤدي إلى نفس التأثير مثل الضغط القوي.

نظرًا لأن ملف xml يحتوي على بنية مشابهة وربما محتوى مشابه إذا تم ضغط الملفات معًا ، فسيكون الضغط أعلى.

على سبيل المثال ، إذا كان الملف يحتوي على السلسلة "<content><element name=" ووجد الضاغط بالفعل أن السلسلة في ملف آخر ستقوم باستبدالها بمؤشر صغير إلى المطابقة السابقة ، إذا لم يستخدم الضاغط "ضغطًا صلبًا" ، فسيتم تسجيل أول ظهور للسلسلة في الملف كحرف أكبر.


42
2017-12-14 20:02





لا يقوم Zip بتخزين محتويات الملف فقط ، بل يخزِّن أيضًا البيانات الوصفية للملف مثل هوية المستخدم ، والأذونات ، وأوقات الإنشاء والتعديل ، وما إلى ذلك. إذا كان لديك ملف واحد ، فلديك مجموعة واحدة من البيانات التعريفية ؛ إذا كان لديك 10000 ملف لديك 10000 مجموعة من البيانات الوصفية.


9
2017-12-14 17:38



نقطة جيدة ، لكن البيانات الوصفية للنظام تستهلك فقط 1.4 ميغابايت من المساحة. انظر تعديلي. - sixtyfootersdude
لست على دراية بالخوارزمية المضغوطة ، لكن البيانات الوصفية ليست مجرد معلومات عن الملفات ، ولكنها أيضًا أشياء مثل الحجم والقواميس ، وربما بعض المعلومات حول توزيع الأحرف. سيكون القاموس على ملف نصي غير فارغ غير الصفر. ربما هذا هو السبب في أنك ترى أن البيانات الوصفية أكبر في ملفات xml من ملفاتك الفارغة. - Ben Richards
هذا كان اول فكر. Zip-File Header Information - WernerCD
هذا يفسر فقط الفرق بين 2 و 3 - وليس 4. - Luaan
Luaan No ، في كل من 2 و 3 يتم تضمين البيانات الوصفية لكل الملفات الـ 10000 في الملف المضغوط أو الملفات ، لذا فإن حجم الملف الكلي يكاد يكون بنفس الحجم. في 4 ، لا يوجد سوى بيانات وصفية لملف واحد ، ويكون الملف المضغوط أصغر كثيرًا. - Mike Scott


خيار تم فقده من خلال البروتوكول الاختياري هو أن يتم ضغط جميع الملفات معًا مع إيقاف التشغيل ، ثم ضغط الرمز البريدي الناتج مع ضبط الضغط على الحد الأقصى. هذا يحاكي تقريبًا سلوك nix .tar.Z و. tar.gz و. tar.bz وغيرها من المحفوظات المضغوطة ، عن طريق السماح للضغط باستغلال عمليات التكرار عبر حدود الملفات (والتي لا تستطيع خوارزمية ZIP فعلها عند التشغيل في البشري). يتيح ذلك استخراج ملفات XML الفردية في وقت لاحق ، ولكنها تزيد من الضغط. الجانب السلبي هو أن عملية الاستخراج تتطلب خطوة إضافية ، تستخدم مؤقتًا مساحة أكبر بكثير من المساحة المطلوبة من ملف .zip العادي.

مع انتشار أدوات مجانية مثل 7-Zip لتمديد عائلة tar إلى Windows ، لا يوجد سبب حقيقي لعدم استخدام .tar.gz أو .tar.bz ، إلخ ، مثل Linux و OS X و BSDs الأدوات المحلية للتلاعب بها.


6
2017-12-15 15:50



gzip و bzip2 قد ينتهي بهما الأمر أسوأ لأنهما مصممان مع ضغط التدفقات في الاعتبار ، لذا سيتعين عليهم بدء إخراج البيانات المضغوطة قبل أن تكون جميع البيانات للضغط معروفة. - rackandboneman
@ crackandboneman: هذه هي المقايضة التي يجب عليك القيام بها عند ضغط الملفات الأكبر من حجم الذاكرة التي ترغب في استخدامها في وقت الضغط. (وأيضا ، فإن مقدار الوقت اللازم لوحدة المعالجة المركزية للعثور على أي شيء مثالي عالميًا سيكون ضخمًا.) يمكن أن يزيد قاموس الضغط الكبير أيضًا من الذاكرة المطلوبة إزالة الضغط. هذا هو خيار LZMA (xz / 7-zip). على أي حال ، يمكن للقواميس التكيفية أن تلتقط الأنماط بمجرد ظهورها. انها ليست مثل ذلك يبني فقط نظام الترميز الثابت على أساس 32k الأولى. هذا هو السبب في أن gzip لا تمتص. - Peter Cordes


يقوم تنسيق ضغط zip بتخزين وضغط كل ملف على حدة. لا يستفيد من التكرار بين الملفات ، فقط داخل الملف.

تسمح عملية إنشاء الملف بتنسيق zip للاستفادة من التكرار عبر جميع الملفات ، مما يؤدي إلى المزيد من الضغط بشكل كبير.

على سبيل المثال ، لنفترض أن لكل ملف XML رأسًا معينًا. يحدث هذا الرأس مرة واحدة فقط في كل ملف ولكنه يتكرر تقريبًا في العديد من الملفات الأخرى. في الطرق 2 و 3 لم يكن ضغط zip لهذا ولكن في الطريقة الرابعة يمكن أن.


5
2017-12-15 01:19



كيف يختلف هذا عن واحد من أفضل 3 إجابات سبق نشرها قبل 5 ساعات؟ - Xen2050
@ Xen2050 لا فرق كبير ، أنا فقط أعتقد أنني يمكن أن أشرح ذلك بشكل أكثر وضوحا. - BonsaiOak
BonsaiOak - ثم إضافة تعليق على الإجابة الصحيحة أو تعديل إذا كان لديك ما يكفي من الممثلين. إذا لم يكن الأمر كذلك ، ولكن تعليقك يضيف المزيد من الوضوح ، فربما يختار شخص آخر ذلك ويعدل المشاركة على أي حال. - AdamV
AdamV أرى وجهة نظرك. جوابي لا يضيف حاليا أي معلومات مفيدة ، على الرغم من أنه يمكن القول إنني عندما كتبت ذلك. هناك بالفعل تعليقات مناسبة تحت الإجابة الأولى حتى لا أرى نقطة في إضافتها أيضًا. هل تقول أنني يجب أن أغلق جوابي؟ ما الضرر الموجود في تركه مفتوحًا؟ - BonsaiOak


بجانب البيانات الوصفية المذكورة مايك سكوت هناك أيضا الحمل في خوارزمية الضغط.

عند ضغط مجموعة من الملفات الصغيرة الفردية عليك أن تكون محظوظًا جدًا لتتمكن من ضغطها بحيث يحدث لملء كتلة ضغط واحدة. عند ضغط كتلة واحدة متجانسة ، يمكن للنظام متابعة تدفق البيانات إلى الخوارزمية الخاصة به ، مع تجاهل "الحدود" (بسبب عدم وجود كلمة أفضل) للملفات الفردية.

ومن المعروف أيضا أن ASCII لديها عامل ضغط مرتفع. بالإضافة إلى xml ، كثيرًا ما تكون متكررة جدًا مما يجعل البيانات الوصفية جزءًا كبيرًا من البيانات التي لا يمكن ضغطها بسهولة كمحتوى xml.

وأخيرًا ، إذا كانت الذاكرة تعمل بشكل صحيح ، فإن zip يستخدم شيئًا مثل تشفير القاموس ، وهو فعال بشكل خاص على ملفات ascii وأكثر من ذلك على XML بسبب تكرارها

شرح ضغط البيانات: http://mattmahoney.net/dc/dce.html


4
2017-12-14 18:02





جرب هذا XML:

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

يحتوي XML على بنية متكررة للغاية ، ويستفيد Zip من تلك التكرار لبناء قاموس منها نمط يحتوي على المزيد من التكرارات ، ثم عند الضغط ، يستخدم بتات أقل لتخزين أكثر تكرارًا أنماط - رسم والمزيد من بت لتخزين أقل تكرارا نمط.

عندما انت سلسل هذه الملفات ، الملف المصدر (مصدر الرمز البريدي) كبير ولكنه يحتوي على أكثر من ذلك بكثير الأنماط المتكررة لأن توزيع ديون الهياكل المملة في XML هي المطفأة في الملف الكبير بأكمله ، لإعطاء الفرصة لـ ZIP لتخزينها نمط باستخدام أقل بت.

الآن ، إذا قمت بدمج XML مختلف في ملف واحد ، حتى عندما تحتوي تلك الملفات على أسماء علامات مختلفة تمامًا ، ستجد أن خوارزمية الضغط هي الأفضل نمطالتوزيع عبر جميع الملفات وليس ملفًا حسب الملف.

في نهاية المطاف وجدت خوارزمية الضغط أفضل توزيع للنمط المتكرر.


3
2017-12-16 01:27