การรวมวิธีการบีบอัดใน 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

ดูเหมือนจะไม่เรียกใช้ไฟล์ผ่านทั้งสามวิธีเลือกที่ดีที่สุด แต่ดูเหมือนว่าจะเลือกก่อนเสมอเนื่องจากการเปลี่ยนลำดับของวิธีการมีผลต่อขนาดไฟล์อย่างมีนัยสำคัญ

แม้ว่าฉันจะเพิ่มหลายไฟล์เช่นไฟล์ XML หนึ่งไฟล์ (PPMd ให้ผลการบีบอัดที่ดีที่สุด) และไฟล์ไบนารีหนึ่งไฟล์ (LZMA2 ทำ) แต่ก็ยังคงแสดงรายการวิธีการทั้งหมดสำหรับไฟล์ทั้งสองและไม่ปรากฏว่าจะสลับแบบไดนามิกต่อไฟล์

ในความเป็นจริงโดยเฉพาะเอกสารกล่าวว่า "คุณสามารถใช้จำนวนของวิธีการใด ๆ ." แต่ก็ไม่ได้บอกว่าทำไม

สิ่งที่ฉันพยายามจะทำให้สำเร็จคือไฟล์ "ลองหลายวิธีเลือกไฟล์ที่ดีที่สุด" แน่นอนฉันสามารถทำได้ด้วยตนเองด้วยการเขียนสคริปต์เล็กน้อย แต่น่าจะเป็นวิธีการบีบอัดการผูกมัดควรทำอย่างนั้น?


การเปลี่ยนลำดับของวิธีการบีบอัดควรเปลี่ยนขนาดที่บีบอัดแม้ว่าจะใช้วิธีการทั้งหมดตามลำดับ การบีบอัดส่วนใหญ่มักจะมาจากวิธีแรกที่ใช้ ผลลัพธ์จากการที่มักจะมีเอนโทรปีสูงจึงบีบอัดได้ยาก มีข้อยกเว้นสำหรับ tranform ที่ไม่คาดว่าจะบีบอัดข้อมูลด้วยตัวเอง แต่เข้ารหัสเพื่อให้สามารถบีบอัดได้มากขึ้น - เช่นลำดับ 1, 2, 3, 4, 5 ไม่มีการซ้ำกันของค่า แต่มีการทำซ้ำความแตกต่างดังนั้น การแปลงเดลต้าช่วยเพิ่มความสามารถในการบีบอัด นั่นคือสิ่งที่คำตอบของ Daniel B เป็นเรื่องเกี่ยวกับ
Steve314

ที่จริงฉันไม่ทราบว่าสิ่งที่ 7zip ทำ - เพียงแค่แสดงความคิดเห็นใน "การเปลี่ยนลำดับของวิธีการที่ส่งผลกระทบต่อตรรกะขนาดไฟล์" ตรรกะ
Steve314

คำตอบ:


5

โดยทั่วไปแล้วข้อมูลที่บีบอัดไม่สามารถบีบอัดได้ (เพิ่มเติม) อย่างมีประสิทธิภาพ หลังจากใช้วิธีการบีบอัดครั้งแรกขนาดไฟล์จะไม่สามารถลดลงอย่างมีนัยสำคัญ

-mN=Xเป็นส่วนใหญ่สำหรับการระบุตัวกรอง (นำมาจากแฟ้มความช่วยเหลือ Windows):

ตัวกรองที่รองรับ:

เดลต้ากรองเดลต้า (“มันเป็นไปได้ที่จะตั้งค่าเดลต้าชดเชยไบต์ตัวอย่างเช่นการบีบอัด 16 บิตไฟล์ WAV สเตอริโอคุณสามารถตั้งค่า '0 = Delta: 4'. เดลต้าเริ่มต้นชดเชยคือ 1”)

BCJ converter สำหรับ x86 executables

ตัวแปลงBCJ2สำหรับ x86 executables (รุ่น 2) (“ BCJ2 เป็นตัวแปลง Branch สำหรับ executables x86 32 บิต (รุ่น 2) มันจะแปลงคำสั่งสาขาบางส่วนเพื่อเพิ่มการบีบอัดเพิ่มเติม”)

ตัวแปลงARMสำหรับเอ็กซีคิวต์ ARM (ตัวเล็ก)

ตัวแปลงARMTสำหรับเอ็กซีคิวต์ ARM Thumb (endian น้อย)

ตัวแปลงIA64สำหรับ IA-64 executables

ตัวแปลงPPCสำหรับไฟล์ปฏิบัติการ PowerPC (big endian)

SPARC converter สำหรับ SPARC executables

นอกจากนี้จากไฟล์วิธีใช้ตัวอย่างขั้นสูงใช้ประโยชน์จากเอาต์พุตหลายสตรีมของตัวกรอง 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 เพื่อเก็บถาวร archive.7z โดยใช้ตัวแปลง BCJ2, LZMA พร้อมพจนานุกรม 8 MB สำหรับเอาต์พุตสตรีมหลัก (s0) และ LZMA พร้อมพจนานุกรม 512 KB สำหรับสตรีมเอาต์พุต s1 และ s2 ของ BCJ2


"หลังจากใช้วิธีการบีบอัดครั้งแรกขนาดไฟล์จะไม่สามารถลดลงได้อย่างมาก" - แน่นอน ความหวังของฉันคือการระบุหลายวิธีจะทำให้ลองใช้ต่อไฟล์แต่ละวิธีที่ระบุและเลือกอย่างมีประสิทธิภาพมากที่สุด โดยธรรมชาติแล้วการบีบอัดข้อมูลจะทำให้ช้าลงมาก
Sören Kuklau

2

ดูเหมือนว่าคุณสามารถใช้ตัวกรองตามลำดับ

โพสต์นี้จากปีที่แล้วมีคำอธิบายที่ดี:

ตัวเลขหลังจากสวิตช์ 7-zip หมายถึงอะไร

หมายเลขนั้นให้คุณกำหนดลำดับของการบีบอัดข้อมูลหากคุณใช้มากกว่าหนึ่งครั้ง

นี่คือตัวอย่างจากเอกสาร:

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 เพื่อเก็บถาวร a.7z โดยใช้ตัวกรอง BCJ2, LZMA พร้อมพจนานุกรม 32 MB สำหรับเอาต์พุตหลัก (s0), และ LZMA พร้อมพจนานุกรม 512 KB สำหรับสตรีมเอาต์พุต s1 และ s2 ของ BCJ2

การบีบอัดแรกคือจำนวนต่ำสุดซึ่งเป็นศูนย์ ในตัวอย่างนี้ศูนย์ถูกตั้งค่าเป็น BCJ2 จากนั้นหนึ่งอันคือ LZMA สองและสามยังเป็น LZMA แต่พวกเขากำลังใช้พารามิเตอร์ d ที่แตกต่างกัน

อ็อพชัน -mb ใช้เพื่อ "ผูก" เอาต์พุตจากการบีบอัดหนึ่งไปยังอินพุตของอีกอันหนึ่ง ในตัวอย่างนี้ BCJ2 มีหนึ่งอินพุตและสี่เอาต์พุต ศูนย์ผลลัพธ์จะไปที่การบีบอัดหมายเลขหนึ่ง เอาต์พุตหนึ่งกำลังบีบอัดหมายเลขสอง เอาท์พุทที่สองไปที่การบีบอัดหมายเลขสาม เอาต์พุตสามไม่ถูกผูกมัด (เพราะไม่จำเป็นต้องบีบอัดอีกครั้ง)

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