อัตราส่วนการบีบอัดสูงสุดของ gzip คือเท่าไหร่


คำตอบ:


90

มันขึ้นอยู่กับข้อมูลที่ถูกบีบอัด การทดสอบอย่างรวดเร็วด้วยไฟล์ 1Gb ที่เต็มไปด้วยศูนย์จะมีขนาดบีบอัด ~ 120Kb ดังนั้นไฟล์ 10Kb ของคุณอาจขยายเป็น ~ 85Mbytes

หากข้อมูลมีความซ้ำซ้อนต่ำในการเริ่มต้นตัวอย่างเช่นไฟล์เก็บถาวรมีไฟล์รูปภาพในรูปแบบที่ถูกบีบอัดแบบดั้งเดิม (gif, jpg, png, ... ) ดังนั้น gzip อาจเพิ่มการบีบอัดไม่ได้เลย สำหรับไฟล์ไบนารีเช่นโปรแกรมที่เรียกใช้งานได้คุณอาจเห็นการบีบอัดสูงถึง 2: 1 สำหรับข้อความธรรมดา HTML หรือมาร์กอัพอื่น 3: 1 หรือ 4: 1 หรือมากกว่านั้นไม่น่าเป็นไปได้ คุณอาจเห็น 10: 1 ในบางกรณี แต่ ~ 8700: 1 ที่เห็นด้วยไฟล์ที่เต็มไปด้วยสัญลักษณ์เดียวคือสิ่งที่คุณจะไม่ได้เห็นภายนอกสถานการณ์จำลองที่คล้ายกัน

คุณสามารถตรวจสอบปริมาณข้อมูลที่จะเป็นผลมาจากการเปิดออกไฟล์ gzip โดยไม่จริงการเขียนเนื้อหาที่ไม่มีการบีบอัดของมันไปยังดิสก์ด้วยgunzip -c file.gz | wc --bytes- นี้จะยกเลิกการบีบอัดไฟล์ แต่ไม่เก็บผลแทนผ่านพวกเขาเพื่อwcที่จะนับจำนวนไบต์ที่พวกเขาผ่าน จากนั้นทิ้งพวกเขา ถ้าเนื้อหาที่ถูกบีบอัดเป็นไฟล์ tar ที่มีไฟล์ขนาดเล็กจำนวนมากมากมายที่คุณอาจพบว่าพื้นที่ดิสก์ที่เห็นได้ชัดมากขึ้นเป็นสิ่งที่จำเป็นในการแกะเก็บเต็ม แต่ในกรณีส่วนใหญ่นับกลับมาจากท่อgunzipส่งออกผ่านทางwcเป็นไปได้เป็นที่ถูกต้องตามที่คุณต้องการ


ฉันเห็น HTML ขยายเป็น 10 เท่า (แน่นอน x3 และ x4 เป็นเรื่องธรรมดาที่สุด!) .... อาจเป็นข้อมูลซ้ำซ้อนมากมายสำหรับคนที่กำลังขยาย + 8 เท่า ฉันคิดว่าหน้าเว็บที่เป็นปัญหานั้นเป็นหน้าข้อมูล php
Zombies

มาร์กอัปซ้ำ ๆ ตามที่เห็นในเอาต์พุตphpinfo()บีบอัดได้ดีมาก ข้อมูลทางเทคนิคในเอาต์พุตนั้นมีการทำซ้ำโดยตรงมากกว่าภาษาธรรมชาติโดยเฉลี่ยและการกระจายตัวอักษรอาจไม่ราบรื่นซึ่งจะช่วยให้เวที Huffman ได้ผลลัพธ์ที่ดีขึ้น
David Spillett

คำตอบนี้ไม่ได้คำนึงถึงข้อมูลที่ถูกบีบอัดที่เป็นอันตราย หนึ่งสามารถสร้างไฟล์ zip ที่เป็นอันตรายรอบ ๆ 10KB ที่สามารถขยายได้ถึง 4GB มากกว่า
David Schwartz

Zip zip ของสเกลนั้นพึ่งพาคลังเก็บซ้อนกันดังนั้นในขณะที่มนุษย์กำลังคลายไฟล์คุณจะสังเกตเห็นสิ่งแปลก ๆ ไม่นาน พวกเขาสามารถใช้เป็น DoS โจมตีที่มีประสิทธิภาพต่อสแกนเนอร์อัตโนมัติ (บนบริการอีเมลและอื่น ๆ ) แม้ว่า
David Spillett

1
@DavidSpillett: ระเบิด zip ที่ซ้อนกันขยายเป็นขนาดในช่วง petabyte นั่นไม่ใช่สิ่งที่ฉันพูดถึง ดูแม้เพียงชั้นเดียวของระเบิด zip ทั่วไป
David Schwartz

10

โดยปกติคุณจะไม่ได้รับการบีบอัดมากกว่า 95% (เพื่อให้ข้อมูล 10kB gzipped จะขยายเป็น ~ 200kB) แต่มีไฟล์ที่สร้างขึ้นมาเป็นพิเศษที่ขยายขึ้นอย่างทวีคูณ ค้นหา42.zipโดยจะขยายข้อมูลเป็นไม่กี่เพตาไบต์ (ไร้ความหมาย)


4
Wikipedia กล่าวว่า 42.zip คือ "มีไฟล์ zip ซ้อนกันห้าชั้นในชุดที่ 16" ดังนั้นจึงไม่ใช่ตัวอย่างที่ถูกต้องสำหรับการคลายการบีบอัด (สำหรับการบีบอัดแบบเรียกซ้ำ)
Tgr

5
แท้จริงแล้ว 42.zip นั้นเป็นอันตรายอย่างยิ่งต่อเครื่องมือที่สแกนไฟล์ซิปซ้ำโดยอัตโนมัติเช่นสแกนไวรัส
thomasrutter

4
นั่นคือ zip ไม่ใช่ gzip
BeniBela

8

อ้างถึง verbatim จากhttps://stackoverflow.com/a/16794960/293815

อัตราส่วนการบีบอัดสูงสุดของรูปแบบการยุบคือ 1032: 1 นี่เป็นเพราะการรันที่ยาวที่สุดที่สามารถเข้ารหัสได้คือ 258 ไบต์ อย่างน้อยสองบิตเป็นสิ่งจำเป็นสำหรับการรันแต่ละครั้ง (หนึ่งบิตสำหรับรหัสความยาวและหนึ่งบิตสำหรับรหัสระยะทาง) ดังนั้น 4 * 258 = 1,032 ไบต์ที่ไม่มีการบีบอัดสามารถเข้ารหัสได้ต่อหนึ่งไบต์ที่บีบอัด

คุณสามารถรับการบีบอัดเพิ่มเติมได้โดย gzipping ผลลัพธ์ของ gzip โดยปกติแล้วจะไม่ปรับปรุงการบีบอัด แต่จะสามารถทำได้นานมาก

โดยวิธีการวิธี LZ77 ใช้โดย deflate ทั่วไปมากกว่าการเข้ารหัสความยาวรัน แทนที่จะใช้ความยาวจะใช้คู่ความยาว / ระยะทาง วิธีนี้ช่วยให้การคัดลอกสตริงจากระยะไกลกลับมาหรือทำซ้ำไบต์เช่นเดียวกับในระยะความยาวหนึ่งหรือจำลองแบบสามไบต์ที่มีระยะทางสามเป็นต้น


6

อัตราส่วนการบีบอัดของอัลกอริทึมการบีบอัดใด ๆ จะเป็นฟังก์ชันของข้อมูลที่ถูกบีบอัด (นอกเหนือจากความยาวของข้อมูลนั้น)

นี่คือการวิเคราะห์ที่MaximumCompression ,
ดูที่หนึ่งของกลุ่มตัวอย่างเช่น

สรุปการทดสอบเกณฑ์มาตรฐานการบีบอัดไฟล์หลาย ๆ ไฟล์

ประเภทไฟล์: หลายประเภทไฟล์ (รวม 46)  
# ของไฟล์ที่จะบีบอัดในการทดสอบนี้: 510  
ขนาดไฟล์ทั้งหมด (ไบต์): 316.355.757 
ขนาดไฟล์เฉลี่ย (ไบต์): 620,305
ไฟล์ที่ใหญ่ที่สุด (ไบต์): 18,403,071
ไฟล์ที่เล็กที่สุด (ไบต์): 3,554


4

ศูนย์ 10 MB ในไฟล์บีบอัดด้วย gzip -9 ถึง 10217 ดังนั้นอัตราส่วนสูงสุดจะอยู่ที่ประมาณ 1,000 เท่า


1

คำตอบสำหรับคำถามของคุณขึ้นอยู่กับอินพุต เพื่อให้คุณมีความคิดว่าการบีบอัดข้อมูลเสร็จแล้วสามารถดูวิดีโอหกนาทีนี้ได้

https://www.youtube.com/watch?v=ZdooBTdW5bM

สิ่งที่คุณควรได้รับจากมันคืออัตราการบีบอัดขึ้นอยู่กับความถี่ของตัวละครแต่ละตัวดังนั้นจึงไม่มีอัตราสูงสุดทั่วไปมันขึ้นอยู่กับอินพุตสำหรับข้อความภาษาอังกฤษประมาณ 65 เปอร์เซ็นต์


1
ยินดีต้อนรับสู่ Super User! โปรดอ้างอิงส่วนสำคัญของคำตอบจากลิงค์อ้างอิงเนื่องจากคำตอบอาจไม่ถูกต้องหากหน้าเชื่อมโยงมีการเปลี่ยนแปลง
DavidPostill

มันจะแม่นยำกว่าถ้าจะพูดว่า "ความถี่ของแต่ละสาย" แทนที่จะเป็น "ความถี่ของตัวละครแต่ละตัว"
JoelFan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.