การสนับสนุนแบบมัลติเธรดใน 7za


18

(ฉันโพสต์สิ่งนี้เป็นครั้งแรกบนเซิร์ฟเวอร์ผิด แต่แล้วฉันก็รู้ว่ามันอาจจะเป็นของที่นี่)

ฉันพยายามบีบอัดไฟล์ข้อความที่มีขนาดใหญ่มากโดยใช้ 7za (p7zip) 9.20 ตัวเลือก -mmt ดูเหมือนจะไม่มีผลใด ๆ ฉันได้ลองทั้ง -mmt = on และ -mmt = 2 แล้ว นี่คือเครื่อง 8-core มีคนคนหนึ่งแนะนำให้เพิ่ม -m0 = lzma2 เป็นอาร์กิวเมนต์ แต่นั่นทำให้ฉัน E_INVALIDARG ไม่มีใครรู้วิธีการทำงานนี้หรือไม่?

สิ่งนี้ไม่มีผล:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

และสิ่งนี้ล้มเหลวด้วยข้อผิดพลาด:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG

ผมเชื่อว่าตัวเลือกที่เป็นเพียงไม่-mmt -mmt=2นอกจากนี้ฉันเชื่อว่าไวยากรณ์ที่ถูกต้องคือ-mx9แม้ว่าทั้งสองอาจทำงานได้
พัฒนา

ขอบคุณ แต่ -mmt ที่ไม่มีตัวเลือกยังคงใช้เพียงหนึ่งเธรด ตามdocs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThreadคุณสามารถระบุจำนวนเธรดที่จะใช้กับ, -mmt = N
Brian L

ฉันยังคงแนะนำให้ใช้ LZMA / Deflate แม้ว่าจะเป็นเธรดเดียวเท่านั้น แม้ว่าคุณจะได้รับความเร็วในการบีบอัดที่เพิ่มขึ้นด้วย BZip2 แต่ก็มีประสิทธิภาพน้อยลงเมื่อทำการบีบอัดข้อความธรรมดาและตัวแปรเธรดเดี่ยวจะช้ากว่า LZMA / Deflate ที่เทียบเท่า
พัฒนา

@Breakthrough: BZip2 มักจะได้รับการบีบอัดที่ดีกว่า DEFLATE ดังที่แสดงในลิงก์ของคุณ นอกจากนี้ยังเร็วกว่า LZMA มาก (เมื่อบีบอัด)
Dennis

คำตอบ:


25

ตามที่-m (ตั้งค่าการบีบอัดวิธี) สวิทช์ # ZipMultiThread - 7zip คู่มือและเอกสาร , mtค่าเริ่มต้นonจึงมีความจำเป็นที่จะระบุว่าที่ทุกคน

อย่างไรก็ตามการใช้อัลกอริทึม DEFLATE ของ 7zip ไม่รองรับการทำงานแบบมัลติเธรด!

ตามที่คุณได้ค้นพบแล้ว

7za a archive.zip bigfile

ใช้เพียงแกนเดียวเท่านั้น

แต่.zipไฟล์บีบอัดทุกไฟล์แยกกัน เมื่อทำการบีบอัดหลายไฟล์ตัวเลือกมัลติเธรดจะบีบอัดหนึ่งไฟล์ต่อหนึ่งคอร์ในคราวเดียว

ลองแล้วคุณจะเห็นว่า

7za a archive.zip bigfile1 ... bigfileN

จะใช้Nแกนที่มีอยู่ทั้งหมด

หากคุณต้องการเพิ่มความเร็วในการบีบอัดไฟล์เดียวคุณมีสองทางเลือก:

  1. แยกเป็นbigfileชิ้น ๆ

  2. ใช้อัลกอริทึมการบีบอัดที่แตกต่างกัน

    ตัวอย่างเช่นการใช้อัลกอริทึมของ 7zip ของ BZip2 รองรับการใช้เธรดหลายเธรด

    ไวยากรณ์คือ:

    7za a -mm=BZip2 archive.zip bigfile
    

นอกจากนี้ข้อผิดพลาดทางไวยากรณ์เกิดจากความพยายามในการใช้อัลกอริทึม LZM สำหรับ.zipคอนเทนเนอร์ มันเป็นไปไม่ได้.

อัลกอริทึมที่เป็นไปได้สำหรับผู้ที่.zipconatiners คือ DEFLATE (64), BZip2 และไม่มีการบีบอัด

หากคุณต้องการใช้อัลกอริทึม LZM ให้ใช้.7zคอนเทนเนอร์ คอนเทนเนอร์นี้ยังจัดการอัลกอริทึมต่อไปนี้: PPMd, BZip2, DEFLATE, BCJ, BCJ2 และไม่มีการบีบอัด


@Dennis ฉันคิดว่า OP ใช้ LZMA (2) ซึ่งจากเอกสาร "การบีบอัด LZMA ใช้เพียง 2 เธรด" แม้ว่าฉันจะเห็นด้วยอย่างสังหรณ์ใจ (เนื่องจากวิธีการเข้ารหัส Lempel-Ziv ) มันจะยากมากที่จะมัลติเธรด LZMA หรือ Deflate (ซึ่งเป็นเพียง LZMA ด้วยการเข้ารหัส Huffman)
พัฒนา

1
@Breakthrough: ในตอนแรกฉันก็เช่นกัน (ลองดูคำตอบที่ฉันได้แก้ไข) นั่นคือข้อผิดพลาดทางไวยากรณ์ที่เกิดขึ้น คุณไม่สามารถใช้การบีบอัด LZMA กับ.zipคอนเทนเนอร์
Dennis

@Dennis ah ขอบคุณสำหรับการล้างข้อมูล ไม่เห็นว่า OP กำลังใช้.ZIPคอนเทนเนอร์
พัฒนา

รอดังนั้นฉันจะได้ผลลัพธ์ที่แตกต่างหากฉันเพิ่งเปลี่ยนนามสกุลไฟล์ของคอนเทนเนอร์เป็น. 7z?
Brian L

3
@BrianL มีปุ่ม "ขอบคุณ" สร้างขึ้นในดูเหมือนลูกศรหงายขึ้น;).
nhinkle

5

นี่เป็นคำถามเก่าไม่ใช่คำตอบสำหรับคำถามเฉพาะ แต่เป็นคำตอบสำหรับวิญญาณของคำถาม (ใช้แกนทั้งหมดเพื่อบีบอัดรูปแบบซิป)

pigz (ขนาน gzip พร้อมตัวเลือก. zip)

pigz -K -k archive.zip bigfile txt

นี่จะทำให้ไฟล์ที่เข้ากันได้กับ Zip เร็วขึ้น 7 เท่าสำหรับระดับการบีบอัดเดียวกัน

การเปรียบเทียบอย่างรวดเร็วของการใช้งานร่วมกันได้ของ zip และ non-zip โดยใช้แกนเดี่ยวและหลายแกน

เวลาผนังบน i7-2600k เพื่อบีบอัดไฟล์ 1.0gb txt บน fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

เวลาผนังเพื่อขยาย

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

ทำไม pigz เมื่อคุณสามารถ pbzip2 หรือ pixz
พยักหน้า

gzip เร็วกว่า bzip2 มากดังนั้นการบีบอัดเพิ่มเติมจึงไม่คุ้มค่าเสมอไป
jesjimher

0

เพียงใช้ -mmt [N + 1]

ตัวอย่างเช่น: -mmt2 ใช้สำหรับหนึ่งเธรด -mmt9 ใช้สำหรับแปดเธรด


-1

ตรวจสอบและทดสอบแล้ว: หากต้องการใช้มัลติเธรดใน 7za พารามิเตอร์จะต้องเป็น "-mmt #" ไม่ใช่ "-mmt = #" การใส่เครื่องหมายเท่ากับทำให้ละเว้น

ฉันค้นพบได้อย่างไร? หลังจากที่ฉันรัน 7z โดยไม่มีพารามิเตอร์ใด ๆ มันจะแสดงข้อมูลเกี่ยวกับพารามิเตอร์บนสวิตช์มันบอกว่า "-mmt [N]", ไม่ใช่ "-mmt = [N]"

ดังนั้นหากฉันเข้าใจดีพารามิเตอร์ที่คุณกำลังพิมพ์ "-mmt = 2" อาจถูกเขียนทับและอาจเป็น "-mmt2" โดยไม่มีเครื่องหมายเท่ากับ

ไม่แน่ใจว่าถ้าฉันเข้าใจดีภาษาอังกฤษของฉันแย่จริงๆ

ทำไมคุณใช้ "7za" แทนที่จะเป็นแค่ "7z" ล่ะ?

ดังนั้นเพื่อทดสอบพารามิเตอร์ฉันรันชุดคำสั่งเพื่อทำ benchmark และยืนยันข้อผิดพลาดการพิมพ์ผิดในเอกสารบางอย่าง ต้องพิมพ์พารามิเตอร์ที่ถูกต้องโดยไม่มีเครื่องหมายเท่ากับ

คำสั่งเพื่อทำเกณฑ์มาตรฐานด้วย 7z โดยมีเพียงหนึ่งเธรด: 7z b -mmt1

คำสั่งเพื่อทำเกณฑ์มาตรฐานด้วย 7z โดยมีเพียงสองเธรด: 7z b -mmt2

คำสั่งเพื่อทำเกณฑ์มาตรฐานด้วย 7za ที่มีเพียงสองเธรด: 7za b -mmt2

คำสั่งเพื่อทำเบนช์มาร์กด้วย 7za โดยมีเพียงหนึ่งเธรด: 7za b -mmt1

ไม่มีเครื่องหมายเท่ากับบนพารามิเตอร์ ˋ-mmt #ˋ ไม่ใช่สำหรับ 7z หรือ 7za

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