ใช้เวลาในการซิปไฟล์ที่มีขนาดใหญ่มาก (100G)


27

ฉันพบว่าตัวเองต้องบีบอัดไฟล์ขนาดใหญ่จำนวนมาก (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

สามสิ่งที่ควรทราบ:

  1. การใช้/usr/bin/timeมากกว่าtimeเนื่องจากคำสั่งในตัวของbashมีตัวเลือกน้อยกว่าคำสั่ง GNU
  2. ฉันไม่ได้กังวลกับการใช้--formatตัวเลือกแม้ว่ามันจะทำให้อ่านไฟล์บันทึกได้ง่ายขึ้น
  3. ฉันใช้ script-in-a-script เนื่องจากtimeดูเหมือนว่าจะทำงานเฉพาะกับคำสั่งแรกในลำดับ piped (ดังนั้นฉันจึงทำให้มันดูเหมือนคำสั่งเดียว ... )

จากการเรียนรู้ทั้งหมดนี้ข้อสรุปของฉันคือ

  1. เร่งความเร็วสิ่งต่างๆด้วย-1ธง (คำตอบที่ยอมรับได้)
  2. ใช้เวลามากขึ้นในการบีบอัดข้อมูลมากกว่าการอ่านจากดิสก์
  3. ลงทุนในซอฟต์แวร์บีบอัดที่เร็วขึ้น ( pigzดูเหมือนเป็นตัวเลือกที่ดี)
  4. หากคุณมีหลายไฟล์ที่จะบีบอัดคุณสามารถใส่แต่ละgzipคำสั่งในเธรดของตนเองและใช้ CPU ที่มีอยู่ได้มากขึ้น (คนจนpigz)

ขอบคุณทุกคนที่ช่วยฉันเรียนรู้สิ่งนี้ทั้งหมด!


tar -cvf ไม่ทำการบีบอัดใด ๆ ดังนั้นมันจะเร็วขึ้น
Parkydr

2
@ Floris: คุณพยายามบีบอัดข้อมูลชนิดใด หมายเหตุด้านข้าง: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzจะแสดงให้คุณเห็นว่าเครื่องบีบอัดข้อมูลของคุณเร็วแค่ไหน side-note2: เก็บผลลัพธ์ไว้ในแผ่นดิสก์อื่น
กิระ

3
ขออภัยฉันอ่านคำถามของคุณผิด gzip มีตัวเลือก
fast

1
@ parkydr: ตัวเลือกที่รวดเร็วคือสิ่งที่ฉันไม่รู้เกี่ยวกับ ... มันเป็นตัวเลือกสุดท้ายในmanหน้าและฉันไม่ได้อ่านมาไกลขนาดนั้น (เพราะเรียงตาม 'คำสั่งตัวอักษรเดียว' ซึ่งก็คือ-#) . นั่นจะสอนให้ฉันรู้จัก RTFM! นี่จะเป็นสิ่งต่อไปที่ฉันลอง!
Floris

2
โปรดทราบว่าหากคอมไพเลอร์ที่เหมาะสมมีอยู่ในเครื่องและการอนุญาตของระบบไฟล์ไม่ได้ตั้งไว้เพื่อห้ามการเรียกใช้ไบนารีจากไดเรกทอรีที่คุณเข้าถึงคุณสามารถรวบรวมpigzและเรียกใช้จากทุกที่ที่คุณสร้างขึ้นโดยไม่ต้องติดตั้ง หากไม่มีคอมไพเลอร์คุณสามารถคอมไพล์คอมไพล์มันบนคอมพิวเตอร์เครื่องอื่นได้แม้ว่ามันจะเริ่มมีความพยายามมากกว่าที่จะคุ้มค่า (ขึ้นอยู่กับเพียงว่าไม่ดีคุณจะต้องบีบอัดนี้ทำงานได้เร็วขึ้นผมคิดว่า.)
เดวิด Z

คำตอบ:


27

คุณสามารถเปลี่ยนความเร็วของ gzip โดยใช้--fast --bestหรือโดย-#ที่ # คือตัวเลขระหว่าง 1 ถึง 9 (1 เป็นเร็วที่สุด แต่บีบอัดน้อยกว่า 9 คือช้าที่สุด แต่บีบอัดมากกว่า) โดยค่าเริ่มต้น gzip จะทำงานที่ระดับ 6


26

เหตุผลที่ tar ใช้เวลาน้อยมากเมื่อเทียบกับ gzip คือมีค่าใช้จ่ายในการคำนวณน้อยมากในการคัดลอกไฟล์ของคุณลงในไฟล์เดียว (ซึ่งเป็นสิ่งที่ทำ) ในทางตรงกันข้าม gzip ใช้การบีบอัดอัลกอริทึมเพื่อลดขนาดไฟล์ tar

ปัญหาคือ gzip ถูก จำกัด (ตามที่คุณค้นพบ) กับเธรดเดี่ยว

ป้อนpigzซึ่งสามารถใช้หลายเธรดเพื่อทำการบีบอัด ตัวอย่างของวิธีใช้สิ่งนี้คือ:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip

มีบทสรุปที่ดี succint ตัวเลือกคือ --use บีบอัดโปรแกรมในช่วงบนเป็นเว็บไซต์น้องสาว


ขอบคุณสำหรับคำตอบและลิงค์ ฉันพูดถึง pigz ในคำถาม
Floris

นี่คือคำตอบที่ถูกต้องที่นี่ .. !
stolsvik

4

ฉันดูเหมือนจะใช้ CPU ตัวเดียวที่ประมาณ 100%

นั่นหมายความว่าไม่มีปัญหาประสิทธิภาพของ I / O แต่การบีบอัดใช้เพียงหนึ่งเธรด (ซึ่งจะเป็นกรณีที่มี gzip)

หากคุณจัดการเพื่อให้บรรลุการเข้าถึง / ข้อตกลงที่จำเป็นในการติดตั้งเครื่องมืออื่น ๆ แล้ว 7zip ยังรองรับหลายเธรดเพื่อใช้ประโยชน์จากซีพียูแบบมัลติคอร์แม้ว่าฉันไม่แน่ใจว่ามันขยายไปถึงรูปแบบ gzip เช่นเดียวกับของตัวเอง

หากคุณยังคงใช้เพียง gzip ในขณะนั้นและมีหลายไฟล์ที่จะบีบอัดคุณสามารถลองบีบอัดทีละไฟล์ได้ด้วยวิธีนี้คุณจะใช้ CPU แบบมัลติคอร์มากกว่าโดยการทำงานมากกว่าหนึ่งกระบวนการแบบขนาน ระวังอย่าทำมากเกินไปเพราะทันทีที่คุณเข้าใกล้ความจุของระบบย่อย I / O ของคุณจะย่อตัวลงอย่างรวดเร็ว (ต่ำกว่าถ้าคุณใช้หนึ่งกระบวนการ / เธรด) เนื่องจากเวลาแฝงของการเคลื่อนไหวของหัวมีความสำคัญ คอขวด


ขอบคุณสำหรับข้อมูลของคุณ คุณให้ความคิดกับฉัน (ซึ่งคุณได้รับ upvote): เนื่องจากฉันมีคลังเก็บหลายชุดเพื่อสร้างฉันสามารถเขียนคำสั่งแต่ละคำสั่งตามด้วย&- จากนั้นให้ระบบจัดการจากที่นั่น แต่ละตัวจะทำงานในโปรเซสเซอร์ของตัวเองและเนื่องจากฉันใช้เวลาในการบีบอัดมากกว่า I / O มันจะใช้เวลาในการทำหนึ่งครั้งในการทำทั้ง 10 อย่าง ดังนั้นผมจึงได้รับ "ผลการดำเนินงานหลักหลาย" จากปฏิบัติการที่เป็นเกลียวเดียว ...
อริส

1

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

tar cf - ไดเรกทอรีที่จะจัดเก็บ | pigz -0 -p largenumber> mydir.tar.gz

ตัวอย่าง - tar cf - patha | pigz -0 -p 32> patha.tar.gz

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

ตัวอย่างการตั้งค่า p = 32 ในกรณีที่เครื่อง CPU 32 ตัวช่วย

0 มีความหมายสำหรับการบีบอัด pigz ที่เร็วที่สุดเนื่องจากไม่บีบอัดที่เก็บถาวรและค่อนข้างจะเน้นที่ความเร็ว ค่าเริ่มต้นคือ 6 สำหรับการบีบอัด

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