เครื่องมือบีบอัด Multi-Core


61

สิ่งที่บีบอัดเครื่องมือที่มีอยู่ในอูบุนตูที่สามารถได้รับประโยชน์จาก CPU แบบ multi-core


เพียงเพื่อบันทึกทางเลือกอาจจะสร้างคลังเก็บอิสระในแบบคู่ขนาน ดังนั้นแทนที่จะสร้าง myfiles.8core.xz ให้คุณสร้าง myfiles1.xz เป็น myfiles8.xz แบบขนาน นี้จะต้องมีตัวแทนส่ง ทั้งสองวิธีมีข้อดีและข้อเสีย
คิวเมนตัส

2
พยายามที่จะแตกไฟล์ขนาด 7GB โดยใช้ bzip2 เท่านั้นเพื่อค้นหาว่าไม่ได้ใช้ทั้ง 8 แกนของฉัน อ่านเกี่ยวกับเรื่องนี้และตัดสินใจลอง pbzip2 ยังคงทำงานบนแกนเดียวเท่านั้น จากนั้นฉันสังเกตเห็นความคิดเห็นที่บอกว่า pbzip2 สามารถบีบอัดไฟล์ที่บีบอัดได้ ความคิดเห็นเดียวกันแนะนำ lbzip2 สามารถขนานอย่างสมบูรณ์ในไฟล์ bz2 ใด ๆ ซึ่งแน่นอนจริง - ใช้เกือบเต็มรูปแบบ (80-90% ของซีพียู) ของแกนทั้งหมดของฉันและมันคลายวิธีเร็ว
Edi Bice

คำตอบ:


34

มีเครื่องมือสองหลัก และlbzip2 pbzip2การใช้งานที่แตกต่างกันของคอมเพรสเซอร์ bzip2 ฉันได้เปรียบเทียบมันแล้ว (ผลลัพธ์เป็นเวอร์ชั่นที่เป็นระเบียบเรียบร้อย แต่คุณน่าจะสามารถเรียกใช้คำสั่งได้)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2ดูเหมือนจะเป็นผู้ชนะในการสุ่มข้อมูล มันบีบอัดน้อยกว่าเล็กน้อย แต่เร็วกว่ามาก YMMV


5
ดูเหมือนว่าตัวเลขจะหายไปจากขนาด pbzip2
Wayne Walker

4
/dev/urandomไม่ใช่ตัวเลือกที่ยอดเยี่ยมในการป้อนข้อมูลสำหรับเครื่องมือบีบอัดข้อมูลเนื่องจากข้อมูลแบบสุ่มนั้นไม่สามารถบีบอัดได้ ส่วนหนึ่งอธิบายว่าทำไมในทั้งสองกรณีไฟล์เอาต์พุตจะมีขนาดใหญ่กว่าอินพุท~ 450MiB
ali_m

1
ขออภัยฉันเป็นคนอวดดี แต่ข้อมูลที่สุ่มอย่างแท้จริงสามารถบีบอัดได้อย่างมาก คุณอาจจะถาม RNG ที่สมบูรณ์แบบสำหรับ 32 00000000000000000000000000000000บิตและได้รับ นั่นเป็นวิธีสุ่มทำงาน) สิ่งที่คุณกำลังพูดถึงคือค่าเฉลี่ยจริง เป็นไปไม่ได้ที่คุณจะสร้างไฟล์ขนาด 100MB ซึ่งเป็นศูนย์ และฉันเห็นด้วยกับวิญญาณของสิ่งที่คุณพูดฉันไม่เห็นด้วยกับ "ตามคำจำกัดความ" เพราะนั่นไม่ใช่คำจำกัดความ (เพราะมันไม่ถูกต้อง)
Oli

2
เมื่อเราตัดสินประสิทธิภาพของวิธีการบีบอัดที่แตกต่างกันสิ่งที่เราสนใจจริงๆคือขนาดเอาต์พุตที่คาดไว้สำหรับตัวอย่างในอนาคตของประเภทข้อมูลที่เราต้องการบีบอัด หากข้อมูลนี้สุ่มอย่างแท้จริงมันจะไม่มีความสม่ำเสมอทางสถิติสำหรับการบีบอัดเพื่อใช้ประโยชน์ดังนั้นสำหรับลำดับของNสุ่มไบต์ที่ดีที่สุดที่เราคาดหวังคือความยาวเอาต์พุตที่คาดหวังของNไบต์ สำหรับตัวอย่างเราอาจทำได้ดีขึ้นเล็กน้อยสำหรับบางคนเราอาจทำได้แย่ลงเล็กน้อย (ในทางปฏิบัติเรามักจะทำสิ่งที่แย่กว่านั้น) แต่ความยาวเอาต์พุตที่คาดหวังจะยังคงเหมือนเดิม
ali_m

5
ฉันหมายถึง "สุ่ม" ในความหมายของ Kolmogorovซึ่งหมายถึงการบีบอัดไม่ได้ ไม่มีเกณฑ์มาตรฐานสากลสำหรับการบีบอัดเนื่องจากอัลกอริทึมที่แตกต่างกันทำงานได้ดีกว่าสำหรับข้อมูลประเภทต่างๆ การเริ่มต้นที่ดีอาจเป็นเพียงการส่งข้อความบางส่วนเช่นwget http://mattmahoney.net/dc/enwik8.zipการหยิบข้อความขนาด 96MB (บีบอัด 21MB) จาก Wikipedia สำหรับชุดที่ครอบคลุมมากขึ้นของมาตรฐาน, ดูที่นี่
ali_m

72

ดีคำที่เป็นคู่ขนาน หลังจากหาเครื่องมือบีบอัดทั้งหมดที่ขนานกันฉันก็พบสิ่งต่อไปนี้:

PXZ - Parallel XZ เป็นยูทิลิตี้การบีบอัดที่ใช้ประโยชน์จากการรันการบีบอัด LZMA ในส่วนต่าง ๆ ของไฟล์อินพุตในหลายคอร์และโปรเซสเซอร์พร้อมกัน เป้าหมายหลักคือการใช้ทรัพยากรทั้งหมดเพื่อเร่งความเร็วการบีบอัดโดยมีอิทธิพลน้อยที่สุดต่ออัตราส่วนการบีบอัด

sudo apt-get install pxz

PLZIP - Lzip เป็นตัวบีบอัดข้อมูลแบบไม่สูญเสียที่ใช้อัลกอริทึม LZMA พร้อมการตรวจสอบความสมบูรณ์ที่ปลอดภัยมากและส่วนติดต่อผู้ใช้ที่คล้ายกับ gzip หรือ bzip2 Lzip คลายการบีบอัดได้เร็วเท่ากับ gzip และบีบอัดได้ดีกว่า bzip2 ซึ่งทำให้เหมาะสำหรับการกระจายซอฟต์แวร์และการจัดเก็บข้อมูล

Plzip เป็นรุ่น lzip แบบขนานอย่างหนาแน่น (แบบมัลติเธรด) โดยใช้รูปแบบไฟล์ lzip; ไฟล์ที่สร้างโดย plzip สามารถใช้งานร่วมกับ lzip ได้อย่างสมบูรณ์

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

sudo apt-get install plzip

PIGZ - pigz ซึ่งย่อมาจาก Parallel Implementation ของ GZip เป็นอุปกรณ์ทดแทนที่ทำงานได้อย่างสมบูรณ์สำหรับ gzip ที่ใช้ประโยชน์จากโปรเซสเซอร์หลายตัวและหลายคอร์เมื่อทำการบีบอัดข้อมูล

sudo apt-get install pigz

PBZIP2 - pbzip2 เป็นการใช้งานแบบขนานของคอมเพรสเซอร์ไฟล์การเรียงลำดับบล็อก bzip2 ที่ใช้ pthreads และรับความเร็วแบบใกล้เคียงเชิงเส้นบนเครื่อง SMP ผลลัพธ์ของรุ่นนี้เข้ากันได้อย่างสมบูรณ์กับ bzip2 v1.0.2 (เช่น: อะไรก็ตามที่บีบอัดด้วย pbzip2 สามารถแตกได้ด้วย bzip2)

sudo apt-get install pbzip2

LRZIP - โปรแกรมบีบอัดแบบมัลติเธรดที่สามารถบรรลุอัตราส่วนการบีบอัดและความเร็วสูงมากเมื่อใช้กับไฟล์ขนาดใหญ่ มันใช้อัลกอริทึมการบีบอัดรวมของ zpaq และ lzma สำหรับการบีบอัดสูงสุด lzo สำหรับความเร็วสูงสุดและการลดความซ้ำซ้อนในระยะยาวของ rzip มันถูกออกแบบมาเพื่อปรับขนาดด้วยการเพิ่มขนาด RAM ปรับปรุงการบีบอัดเพิ่มเติม ทางเลือกของการปรับขนาดหรือความเร็วช่วยให้สามารถทำการบีบอัดที่ดีกว่า lzma อย่างใดอย่างหนึ่งหรือความเร็วที่ดีกว่า gzip แต่ด้วยระดับการบีบอัดขนาด bzip2

sudo apt-get install lrzip

เกณฑ์มาตรฐานการบีบอัดขนาดเล็ก (การใช้ Oli ทดสอบที่สร้างขึ้น):

ขนาดไฟล์ต้นฉบับ - 100 MB
PBZIP2 - 101 MB (ใหญ่กว่า 1%)
PXZ - 101 MB (ใหญ่กว่า 1%)
PLZIP - 102 MB (ใหญ่กว่า 1%)
LRZIP - 101 MB (ใหญ่กว่า 1%)
PIGZ - 101 MB (ใหญ่กว่า 1%) )

เกณฑ์มาตรฐานการบีบอัดขนาดเล็ก (การใช้ไฟล์ข้อความ):

ขนาดไฟล์ต้นฉบับ - ไฟล์ข้อความ 70 KB
PBZIP2 - 16.1 KB (23%)
PXZ - 15.4 KB (22%)
PLZIP - 15.5 KB (22.1%)
LRZIP - 15.3 KB (21.8%)
PIGZ - 17.4 KB (24.8%)


ตัวอย่างจะดีมาก
earthmeLon

@earthmeLon อ่านคำตอบโดย Oli ซึ่งกล่าวถึงวิธีการสร้างไฟล์ตัวอย่าง จากนั้นดำเนินการตามคำสั่งที่ฉันใช้
Luis Alvarado

ฉันหวังว่าผลลัพธ์ของสิ่งเหล่านี้จะสามารถทำงานร่วมกันได้ เช่นเอาท์พุทจากlrzipสามารถถูกบีบอัดโดยใช้pbzip2ตัวอย่างเช่น
Vineet Menon

10

นอกจากนี้บทสรุปที่ดีข้างต้น (ขอบคุณ Luis) คนเหล่านี้อาจต้องการพิจารณา PIXZ ซึ่งเป็นไปตาม README (ที่มา: https://github.com/vasi/pixz) - ฉันยังไม่ได้ตรวจสอบการอ้างสิทธิ์ด้วยตัวเอง ) มีข้อได้เปรียบเหนือ PXZ

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

กล่าวอีกนัยหนึ่ง PIXZ เป็นหน่วยความจำและดิสก์ที่มีประสิทธิภาพมากกว่าที่คาดคะเนและมีคุณสมบัติการทำดัชนีเพิ่มเติมซึ่งจะช่วยเพิ่มความเร็วในการคลายการบีบอัดส่วนประกอบแต่ละส่วนของไฟล์ tar ที่ถูกบีบอัด


อย่างไรก็ตามมันเป็นความเข้าใจของฉันว่าpixzคลังเก็บไม่เข้ากันกับxzรูปแบบมาตรฐานวิธีที่pxzจะเป็น
Mxx

5
@Mxx: รูปแบบไฟล์เข้ากันได้ pixzสามารถขยายxzคลังข้อมูลและxzสามารถขยายpixzจดหมายเหตุ อย่างไรก็ตามตัวเลือกบรรทัดคำสั่งในxzและpixzแตกต่างกัน
สโนว์บอล

pixzไฟล์ที่จัดทำดัชนีเป็นชัยชนะที่ยิ่งใหญ่สำหรับ
ostrokach

8

ปรับปรุง:

XZ Utilsรองรับการบีบอัดแบบมัลติเธรดตั้งแต่ v5.2.0 แต่เดิมมีการบันทึกผิดพลาดว่าเป็นการบีบอัดแบบมัลติเธรด

ตัวอย่างเช่น: tar -cf - source | xz --threads=0 > destination.tar.xz


นอกจากนี้คุณยังสามารถเรียกใช้export XZ_DEFAULTS="-T 0" และจากนั้นเพียงแค่ใช้โทร tar tar cJf target.tar.xz sourceตามปกติของคุณคือ
scai

4

lzopอาจเป็นตัวเลือกที่ทำงานได้แม้ว่าจะเป็นเธรดเดี่ยว

มันใช้มากอย่างรวดเร็วLempel-Ziv-oberhumerวิธีการบีบอัดซึ่งเป็น 5-6 ครั้งได้เร็วกว่าใน gzip สังเกตของฉัน

หมายเหตุ: แม้ว่าจะยังไม่เป็นแบบมัลติเธรด แต่ก็อาจมีประสิทธิภาพสูงกว่าหมูในระบบหลัก 1-4 เครื่อง นั่นเป็นเหตุผลที่ฉันตัดสินใจโพสต์สิ่งนี้แม้ว่าจะไม่ได้ตอบคำถามของคุณโดยตรง ลองใช้มันอาจช่วยแก้ปัญหาคอขวดของคุณในขณะที่ใช้ CPU เพียงตัวเดียวและบีบอัดให้แย่ลงเล็กน้อย ฉันพบว่ามันมักจะเป็นทางออกที่ดีกว่าเช่น pigz


มันจะดีกว่าในการคลายการบีบอัดหรือ การบีบอัดใช้เวลาเท่ากัน (หรือแย่กว่า) กว่า gzip
Lennart Rolland

ฉันสามารถเป็นพยานได้ว่าlzopเร็วมาก Proxmoxใช้ lzop สำหรับการสำรองข้อมูลของเครื่องเสมือนโดยค่าเริ่มต้น
Lonnie Best

1
lz4เร็วยิ่งขึ้น (และมีเวอร์ชั่นแบบมัลติเธรด)
David Balažic


3

มันไม่ได้เป็นคำตอบจริงๆ แต่ฉันคิดว่ามันมีความเกี่ยวข้องพอที่จะแบ่งปันมาตรฐานเปรียบเทียบความเร็วgzipและpigzHW จริงในสถานการณ์ชีวิตจริง เช่นเดียวpigzกับวิวัฒนาการที่มีหลายเธรดฉันเลือกที่จะใช้ตั้งแต่นี้ไป

เมตา

  • ฮาร์ดแวร์ที่ใช้: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + Nvme SSD
  • การกระจาย GNU / Linux: Xubuntu 17.10 (artful)
  • gzip รุ่น: 1.6
  • pigz รุ่น: 2.4
  • ไฟล์ที่ถูกบีบอัดคือ9.25 GiB SQL dump

gzip รวดเร็ว

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip ดีที่สุด

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz รวดเร็ว

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigzดีที่สุด (ไม่zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopfliอัลกอริทึม

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

ในฐานะที่เป็นบรรทัดล่างฉันจะไม่แนะนำzopfliอัลกอริทึมเนื่องจากการบีบอัดใช้เวลาจำนวนมหาศาลสำหรับพื้นที่ดิสก์ที่ไม่ได้ใช้อย่างมีนัยสำคัญ

ขนาดไฟล์ผลลัพธ์:

  • ดีที่สุด : 1309M
  • ฉบับย่อ : 1680M
  • zopfli : 1180M

2

Zstandardรองรับมัลติเธรดตั้งแต่v1.2.0 ¹ มันเป็นคอมเพรสเซอร์และตัวคลายการบีบอัดที่รวดเร็วมากที่ต้องการแทนที่ gzip และยังสามารถบีบอัดได้อย่างมีประสิทธิภาพ - ถ้าไม่ดีกว่า - เหมือน LZMA2 / XZ ในระดับสูงสุด

คุณต้องใช้งานฝีมือหรือรุ่นที่ใหม่กว่าหรือรวบรวมรุ่นล่าสุดจากแหล่งที่มาเพื่อรับสิทธิประโยชน์เหล่านี้ โชคดีที่มันไม่ได้มีการพึ่งพามากนัก

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