ฉันพบว่าตัวเองต้องบีบอัดไฟล์ขนาดใหญ่จำนวนมาก (80-ish GB) และฉันประหลาดใจที่ความเร็ว (ขาด) ที่ระบบของฉันกำลังแสดง ฉันได้รับความเร็วการแปลงประมาณ 500 MB / นาที; ใช้top
ฉันดูเหมือนจะใช้ CPU เดียวที่ประมาณ 100%
ฉันค่อนข้างมั่นใจว่ามันไม่ใช่ (เพียง) ความเร็วในการเข้าถึงดิสก์ตั้งแต่การสร้างtar
ไฟล์ (นั่นเป็นวิธีที่ไฟล์ 80G ถูกสร้างขึ้น) ใช้เวลาเพียงไม่กี่นาที (อาจจะ 5 หรือ 10) แต่หลังจากผ่านไป 2 ชั่วโมงคำสั่ง gzip ง่าย ๆ ยังไม่เสร็จ.
สรุป:
tar -cvf myStuff.tar myDir/*
ใช้เวลา <5 นาทีเพื่อสร้างไฟล์ tar 87 G
gzip myStuff.tar
ใช้เวลาสองชั่วโมง 10 นาทีสร้างไฟล์ zip 55G
คำถามของฉัน: ปกติหรือไม่ มีตัวเลือกบางอย่างในgzip
การเร่งสิ่งต่าง ๆ หรือไม่ การเชื่อมคำสั่งและการใช้งานจะเร็วขึ้นtar -cvfz
หรือไม่ ฉันเห็นการอ้างอิงถึงpigz
- การใช้งานแบบขนานของ GZip - แต่น่าเสียดายที่ฉันไม่สามารถติดตั้งซอฟต์แวร์บนเครื่องที่ฉันกำลังใช้อยู่ได้ดังนั้นจึงไม่ใช่ตัวเลือกสำหรับฉัน ดูตัวอย่างคำถามนี้ก่อนหน้านี้
ฉันตั้งใจจะลองใช้ตัวเลือกเหล่านี้ด้วยตัวเองและตั้งเวลา - แต่ก็มีโอกาสมากที่ฉันจะไม่กดปุ่ม ฉันหวังว่าบางคนในเว็บไซต์นี้จะรู้เคล็ดลับที่ถูกต้องเพื่อเร่งความเร็ว
เมื่อฉันได้ผลลัพธ์ของการทดลองอื่น ๆ ฉันจะอัปเดตคำถามนี้ - แต่ถ้าใครมีเคล็ดลับที่ดีเป็นพิเศษฉันจะขอบคุณมันจริงๆ บางที gzip อาจใช้เวลาประมวลผลมากกว่าที่ฉันรู้ ...
UPDATE
ตามที่สัญญาไว้ฉันลองใช้เทคนิคที่แนะนำด้านล่าง: เปลี่ยนจำนวนการบีบอัดและเปลี่ยนปลายทางของไฟล์ ฉันได้ผลลัพธ์ต่อไปนี้สำหรับ tar ที่มีขนาดประมาณ 4.1GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
ดังนั้นใช่การเปลี่ยนแฟล็กจากค่าเริ่มต้น-6
เป็นเร็วที่สุด-1
ทำให้ฉันเพิ่มความเร็ว 30% ด้วย (สำหรับข้อมูลของฉัน) แทบจะไม่เปลี่ยนแปลงขนาดของไฟล์ zip ไม่ว่าฉันจะใช้ดิสก์แผ่นเดียวกันหรืออย่างอื่นก็ไม่มีความแตกต่าง (ฉันจะต้องเรียกใช้หลาย ๆ ครั้งเพื่อให้มีนัยสำคัญทางสถิติ)
หากใครสนใจฉันสร้างเกณฑ์กำหนดเวลาเหล่านี้โดยใช้สองสคริปต์ต่อไปนี้:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
และสคริปต์ที่สอง ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
สามสิ่งที่ควรทราบ:
- การใช้
/usr/bin/time
มากกว่าtime
เนื่องจากคำสั่งในตัวของbash
มีตัวเลือกน้อยกว่าคำสั่ง GNU - ฉันไม่ได้กังวลกับการใช้
--format
ตัวเลือกแม้ว่ามันจะทำให้อ่านไฟล์บันทึกได้ง่ายขึ้น - ฉันใช้ script-in-a-script เนื่องจาก
time
ดูเหมือนว่าจะทำงานเฉพาะกับคำสั่งแรกในลำดับ piped (ดังนั้นฉันจึงทำให้มันดูเหมือนคำสั่งเดียว ... )
จากการเรียนรู้ทั้งหมดนี้ข้อสรุปของฉันคือ
- เร่งความเร็วสิ่งต่างๆด้วย
-1
ธง (คำตอบที่ยอมรับได้) - ใช้เวลามากขึ้นในการบีบอัดข้อมูลมากกว่าการอ่านจากดิสก์
- ลงทุนในซอฟต์แวร์บีบอัดที่เร็วขึ้น (
pigz
ดูเหมือนเป็นตัวเลือกที่ดี) - หากคุณมีหลายไฟล์ที่จะบีบอัดคุณสามารถใส่แต่ละ
gzip
คำสั่งในเธรดของตนเองและใช้ CPU ที่มีอยู่ได้มากขึ้น (คนจนpigz
)
ขอบคุณทุกคนที่ช่วยฉันเรียนรู้สิ่งนี้ทั้งหมด!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
จะแสดงให้คุณเห็นว่าเครื่องบีบอัดข้อมูลของคุณเร็วแค่ไหน side-note2: เก็บผลลัพธ์ไว้ในแผ่นดิสก์อื่น
man
หน้าและฉันไม่ได้อ่านมาไกลขนาดนั้น (เพราะเรียงตาม 'คำสั่งตัวอักษรเดียว' ซึ่งก็คือ-#
) . นั่นจะสอนให้ฉันรู้จัก RTFM! นี่จะเป็นสิ่งต่อไปที่ฉันลอง!
pigz
และเรียกใช้จากทุกที่ที่คุณสร้างขึ้นโดยไม่ต้องติดตั้ง หากไม่มีคอมไพเลอร์คุณสามารถคอมไพล์คอมไพล์มันบนคอมพิวเตอร์เครื่องอื่นได้แม้ว่ามันจะเริ่มมีความพยายามมากกว่าที่จะคุ้มค่า (ขึ้นอยู่กับเพียงว่าไม่ดีคุณจะต้องบีบอัดนี้ทำงานได้เร็วขึ้นผมคิดว่า.)