การแปลงไฟล์ gzip เป็น bzip2 อย่างมีประสิทธิภาพ


10

ฉันมีไฟล์ gzip มากมายที่ฉันต้องแปลงเป็น bzip2 ทุก ๆ คราวแล้ว ขณะนี้ฉันใช้เชลล์สคริปต์เพียงแค่ 'gunzip ของแต่ละไฟล์แล้ว' bzip2 ของมัน แม้ว่างานนี้จะใช้เวลามากของเวลาที่จะเสร็จสมบูรณ์

เป็นไปได้ไหมที่จะทำให้กระบวนการนี้มีประสิทธิภาพมากขึ้น? ฉันพร้อมที่จะดำน้ำและมองหาซอร์สโค้ดของ gunzip และ bzip2 หากจำเป็น แต่ฉันแค่ต้องการให้แน่ใจว่าได้ผลตอบแทน มีความหวังในการปรับปรุงประสิทธิภาพของกระบวนการหรือไม่?

คำตอบ:


1

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

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

ซึ่งเร็วกว่าการใช้bzip2มาก


สวัสดีฉันได้เปลี่ยนคำตอบที่ยอมรับไปแล้วเนื่องจากนี่เป็นตัวเลือกที่ดีที่สุดสำหรับคนที่สะดุดกับคำถามในวันนี้ ขอบคุณสำหรับการpbzip2กล่าวถึง ในกรณีที่การเชื่อมโยงไม่ได้โหลดสำหรับคนอื่นนี่คือหน้าโครงการและหน้าคน
sundar - Reinstate Monica

15

แทนที่จะ gunzip ในขั้นตอนเดียวและอีก bzip2 ในอีกฉันสงสัยว่ามันอาจจะมีประสิทธิภาพมากขึ้นในการใช้ท่อ สิ่งที่ต้องการgunzip --to-stdout foo.gz | bzip2 > foo.bz2

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


2
+1 สำหรับการวางท่อดิสก์ I / O เป็นสิ่งที่คุณต้องการหลีกเลี่ยง สำหรับการบีบอัดนอกเสียจากว่าฉันเข้าใจผิด bzip2 ไม่ใช่เรื่องคู่ขนาน คุณจะต้องใช้บางสิ่งบางอย่างเช่น pbzip2 เพื่อบีบอัดใน parallell: compression.ca/pbzip2
gustafc

... และน่าเสียดายที่ดูเหมือนว่าจะไม่มีโปรแกรมบีบอัด gzip ใด ๆ ที่คล้ายคลึงกัน
gustafc

@ gustafc: ขอบคุณสำหรับลิงค์ไปยัง pbzip2, มันมีประโยชน์มาก ... @OP: ฉันเบือนหน้าหนีจากท่อ bcos ฉันต้องการที่จะสามารถจัดการกับไฟล์ gz ที่เสียหาย ฯลฯ โดยไม่สูญเสียพวกเขาในท่อ ...
sundar - Reinstate Monica

4
@ gustafc: แม้ว่าbzip2และgzipจะไม่ทำงานแบบขนานภายในโดยการใช้ไพพ์คุณสามารถให้มันทำงานแบบขนานได้เพราะไพพ์เริ่มโดยปริยายสองกระบวนการซึ่งจะทำงานแบบขนาน ดังนั้นอย่างน้อยการบีบอัดและบีบอัดจะทำงานในแบบคู่ขนาน
sleske

1
@sleske แม้ว่าคุณจะถูกต้องในทางทฤษฎีแล้วbzip2การใช้งานซีพียูของดาวแคระก็เป็นgunzipสิ่งที่ดีดังนั้นในการฝึกฝนความเท่าเทียมที่คุณได้รับจากที่นี่ก็น้อยมาก ไม่ต้องทำดิสก์ IO ยังดีอยู่ดี!
Johan Walles

6

GNU parallel ( http://www.gnu.org/software/parallel ) อาจเป็นตัวเลือกหากคุณมีหลายคอร์ (หรือหลายเครื่อง):

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

อ่านหน้ากวดวิชา / คนสำหรับรายละเอียดและตัวเลือก


3

สิ่งที่คุณกำลังทำคือทางออกที่ดีที่สุดของคุณ ไม่มีเครื่องมือการแปลงและการพยายาม bzip2 ไฟล์ gzipped ที่แล้วไม่ได้เป็นตัวเลือกจริงๆเพราะมันมักจะมีผลกระทบที่ไม่พึงประสงค์ เนื่องจากอัลกอริทึมนั้นแตกต่างกันการแปลงจึงเกี่ยวข้องกับการดึงข้อมูลต้นฉบับโดยไม่คำนึงถึง เว้นแต่ว่าการ gzipping นั้นเป็นขั้นตอนหนึ่งในกระบวนการ bzip2 ซึ่งมันก็ไม่น่าเสียดาย


อัลกอริทึมไม่มีขั้นตอนการซ้อนทับเช่นฉันสามารถข้ามขั้นตอนเดียวในการคลายการบีบอัด gzip และขั้นตอนการบีบอัด bzip เหมือนกันได้หรือไม่
sundar - Reinstate Monica

2
@sundar ฉันไม่คิดอย่างนั้น gzipใช้ Leimpel-Ziv 77 ในขณะที่bzip2ใช้ Burrows-Wheeler อัลกอริทึมที่แตกต่างกันฉันกลัว
new123456

2

บางครั้งฉันต้องทำสิ่งเดียวกันกับไฟล์บันทึก ฉันเริ่มด้วยไฟล์ * .gz ที่เล็กที่สุดก่อน ( ls -rS), gunzip จากนั้น bzip2 แยกกันทีละไฟล์ ฉันไม่ทราบว่าเป็นไปได้หรือไม่ที่จะส่งเอาต์พุต gunzip โดยตรงไปยังอินพุต bzip2 คำสั่ง bzip2 นั้นช้ากว่าการบีบอัดมากกว่า gunzip ที่กำลังคลายการบีบอัดซึ่งอาจใช้หน่วยความจำและพื้นที่สว็อปบนโฮสต์

ยินดีต้อนรับการปรับปรุงหรือข้อเสนอแนะ นี่คือหนึ่งซับของฉัน:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

ขอบคุณสำหรับอินพุตจุดเกี่ยวกับความแตกต่างของความเร็วระหว่างสองกระบวนการและความหมายของมันเป็นสิ่งสำคัญ
sundar - Reinstate Monica


1

เพิ่งต้องทำสิ่งนี้ไม่กี่นาทีที่ผ่านมา:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

ที่ไหนrezipจะถูกกำหนดเป็น:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

คุณสามารถสร้างหลายเธรดได้โดยใช้-Pตัวเลือกด้วยxargsแต่ต้องระวังด้วย (เริ่มต้นต่ำ!)

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