วิธีที่ดีที่สุดในการใช้ขนาน bzip2 และ gzip โดยค่าเริ่มต้นคืออะไร?


41

Bzip2 และ gzip ใช้เพียงแกนเดียวเท่านั้นแม้ว่าคอมพิวเตอร์หลายเครื่องจะมีแกนมากกว่าหนึ่งแกนก็ตาม แต่มีโปรแกรมเช่น lbzip2, pbzip2 และ pigz ซึ่งใช้แกนประมวลผลที่มีอยู่ทั้งหมดและสัญญาว่าจะเข้ากันได้กับ bzip2 และ gzip

ดังนั้นวิธีที่ดีที่สุดในการใช้โปรแกรมเหล่านี้โดยค่าเริ่มต้นคืออะไรดังนั้นจึงtar cfa file.tar.bz2 directoryใช้ lbzip2 / pbzip2 แทนที่จะเป็น bzip2 แน่นอนฉันไม่ต้องการทำลายอะไร


2
จากความอยากรู้อยากเห็นให้กับทุกคน: ขนาน gzip / bzip เร็วกว่าอนุกรมจริง ๆ หรือไม่? ฉันคิดว่าความเร็วในการเขียนของ hdd และข้อ จำกัด อื่น ๆ นั้นเป็นปัญหามากกว่า
con-f-use

@ con-f-use ไม่เว้นแต่คุณจะมี SSD ในทางทฤษฎีแล้วมันอาจเร็วกว่าเมื่อขนาดรวมของไฟล์เก็บถาวรเพิ่มขึ้น
Marco Ceppi

1
บนระบบที่มี 16 cpus การเปลี่ยนจาก gzip เป็น pigz ลดเวลาในการ tar 1.2TB และถ่ายโอนผ่านเครือข่ายและทดสอบผลลัพธ์จากการสำรองข้อมูล 18 ชั่วโมงและการทดสอบ 14 ชั่วโมงเป็น 4 ชั่วโมงของการสำรองข้อมูลและการทดสอบ 2 ชั่วโมง มีคอขวดจำนวนมากที่อาจเกิดขึ้นความเร็วดิสก์ความเร็วเครือข่ายอำนาจการประมวลผล แต่ในกรณีนี้นี่คือซีพียูที่ถูกผูกไว้แน่นอนมากกว่า IO ผูกพัน นี่เป็นระบบระดับสูงผลลัพธ์ของคุณอาจแตกต่างกันไป ไม่ว่าจะเป็นเรื่องสำคัญ แต่เป็นเรื่องของ RHEL6
cs_alumnus

คำตอบ:


32

คุณสามารถเชื่อมโยง bzip2, bunzip2 และ bzcat ไปยัง lbzip2 และ gzip, gunzip, gzcat และ zcat ไปยัง pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

ฉันเลือก lbzip2 แทน pbzip2 เพราะ /usr/share/doc/lbzip2/README.gz ดูเป็น "nicer" มากกว่า /usr/share/doc/pbzip2/README.gz คู่มือ tar ยังพูดถึง lbzip2ด้วย

แก้ไข:

pigz-2.1.6 ซึ่งรวมอยู่ใน Pangolin ที่แม่นยำปฏิเสธที่จะแตกไฟล์ด้วยคำต่อท้ายที่ไม่รู้จัก (เช่น initramfs - *. img) สิ่งนี้ได้รับการแก้ไขใน pigz-2.2.4 ซึ่งมาพร้อมกับ Quantal ดังนั้นคุณอาจต้องการรอจนกระทั่ง Quantal ติดตั้งแพ็คเกจ Quantalด้วยตนเองหรือไม่ต้องเชื่อมโยง gunzip / gzcat / zcat เลย


7
วิธีนี้ใช้งานได้ดีเพราะ / usr / local / bin / มาก่อน / bin / ใน $ PATH ของคนส่วนใหญ่ หากมีสิ่งใดที่เรียก / bin / gunzip โดยตรงหรือบางคนมี / bin ก่อนใน $ PATH พวกเขาจะไม่ใช้ pigz เพื่อให้งานนี้สำหรับพวกเขาเช่นกันคุณสามารถใช้dpk-divertและทำสิ่งนี้สำหรับไบนารีทั้งหมดsudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipแต่มีความเป็นไปได้ที่ pigz จะไม่เข้ากัน 100% กับธง gzip ทั้งหมดดังนั้นควรระมัดระวัง
Mark McKinstry

31

แนวคิด symlink ดีมาก
วิธีแก้ปัญหาการทำงานอื่นคือนามแฝงtar:

alias tar='tar --use-compress-program=pbzip2'

หรือตามลำดับ

alias tar='tar --use-compress-program=pigz'

มันสร้างค่าเริ่มต้นอีกประเภทหนึ่ง


สิทธิประโยชน์เพิ่มเติม: คุณสามารถใช้นามแฝงเช่น 'partar' ถ้าคุณต้องการที่จะรักษาฟังก์ชันการทำงานที่เดิม (ด้วยเหตุผลบางอย่าง) .. เศร้า 'ptar' จะดำเนินการโดยการดำเนินงานของ Perl
Jena

13

คำตอบ symlink ไม่ถูกต้องจริงๆ มันจะแทนที่ค่าเริ่มต้น gzip (หรือ bzip2) ด้วย pigz (หรือ pbzip2) สำหรับทั้งระบบ ในขณะที่การใช้งานแบบขนานนั้นคล้ายกับรุ่นกระบวนการเพียงอย่างเดียวความแตกต่างเล็กน้อยในตัวเลือกบรรทัดคำสั่งอาจทำให้กระบวนการระบบหลักที่ขึ้นอยู่กับความแตกต่างเหล่านั้น

ตัวเลือก "--use-compress-program" เป็นตัวเลือกที่ดีกว่ามาก ตัวเลือกที่สอง (คล้ายกับนามแฝง) คือการตั้งค่าตัวแปรสภาพแวดล้อม TAR_OPTIONS ที่ GNU tar สนับสนุน:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
ฉันใช้ symlink มาตั้งแต่ปี 2554 และไม่เห็นความแตกต่าง (นอกเหนือจากกรณีที่กล่าวถึงในการแก้ไข) และหากไม่พบความแตกต่างเล็กน้อยดังกล่าวเราจะติดอยู่กับเวอร์ชันที่ไม่ขนานกันตลอดไป หากคุณใช้ TAR_OPTIONS = "- use-compress-program = pbzip2" ดูเหมือนว่าคุณจะไม่สามารถแยกความแตกต่างระหว่าง bzip2 และ gzip
elmicha

สิ่งนี้ไม่ได้ผลสำหรับฉัน
Derek Perkins

3

ทางเลือกหนึ่งที่น่าสนใจคือการคอมไพล์ tar เพื่อใช้งานมัลติเธรดโดยปริยาย คัดลอกมาจากคำตอบ stackoverflow นี้

คอมไพล์ใหม่ด้วยการเปลี่ยน

หากคุณสร้าง tar จากแหล่งต่าง ๆ คุณสามารถคอมไพล์ใหม่ด้วยพารามิเตอร์

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

หลังจากการคอมไพล์ tar ใหม่ด้วยตัวเลือกเหล่านี้คุณสามารถตรวจสอบผลลัพธ์ของความช่วยเหลือของ tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

-2

ใช้ใน ~ / .bash_aliases ของคุณ:

alias gzip="pigz"
alias gunzip="unpigz"

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