วิธี XZ ไดเรกทอรีที่มี TAR โดยใช้การบีบอัดสูงสุด?


116

ดังนั้นฉันต้องบีบอัดไดเรกทอรีด้วยการบีบอัดสูงสุด

ฉันจะทำอย่างไรกับมันxz? ฉันหมายความว่าฉันจะต้องเกินไปเพราะฉันไม่สามารถบีบอัดไดเรกทอรีที่มีเพียงtar xzมีผู้ประกอบการผลิตเองfoo.tar.xzหรือไม่?


11
FWIW man 1 xzพูดit's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1). -7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.RTFM สำหรับข้อมูลเพิ่มเติม
cychoi

คำตอบ:


82

สมมติว่าxzให้เกียรติชุดธงมาตรฐานของ commandline - รวมถึงธงระดับการบีบอัดคุณสามารถลอง:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

และนี่ใช้ระดับการบีบอัดสูงสุดด้วย XZ หรือไม่
LanceBaynes

3
การเพิ่ม -9 ถึง xz จะทำให้มันสูงสุด
bsd

23
-9eเป็นระดับที่ดีที่สุด แต่จะใช้เวลานานมาก
Krzysztof Krasoń

-9eจะไม่ให้ผลลัพธ์ที่ดีที่สุดเสมอไป - ดูจุดที่ 8 ที่นี่rootusers.com/13-simple-xz-examples
KolonUK

1
นอกจากนี้คุณอาจเห็นการปรับปรุงที่สำคัญถ้าคุณเพิ่ม--threads=0ใน xz
KolonUK

146

ด้วย GNU ล่าสุดtarบน bash หรือ shell ที่ได้รับ:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

สวิตช์ j ตัวพิมพ์เล็กของ tar ใช้ bzip, สวิตช์ตัวพิมพ์ใหญ่ J ใช้ xz

XZ_OPTตัวแปรสภาพแวดล้อมช่วยให้คุณสามารถตั้งค่าตัวเลือกที่ไม่สามารถผ่านการใช้งานผ่านทางโทรเช่น xztar

นี่คือสูงสุดแล้ว

ดูman xzตัวเลือกอื่น ๆ ที่คุณสามารถตั้งค่า ( -e/ --extreme อาจให้ประโยชน์การบีบอัดเพิ่มเติมสำหรับชุดข้อมูลบางชุด)

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
ไม่คุณทำไม่ได้ นั่นคือประเด็นทั้งหมด คุณสามารถตั้งค่า var สภาพแวดล้อมสำหรับการร้องขอนั้น คุณสามารถส่งออกได้ถ้าคุณต้องการ แต่คุณไม่จำเป็นต้อง
bsd

2
คุณกำลังสมมติว่าเชลล์เหมือนทุบตีสำหรับสิ่งนั้น
anddam

7
@anddam ที่ได้รับการสนับสนุนจากเปลือกหอยทั้งหมดของครอบครัวบอร์น (บอร์ ksh, mksh, pdksh เถ้าประทุบตี Yash, zsh) และและrc , , และเป็นเปลือกหอยที่สำคัญที่ไม่สนับสนุนมัน ที่นั่นคุณจะใช้คำสั่ง akangafishcshtcshesenv
Stéphane Chazelas

1
ดังนั้นในการตั้งค่าทั้งสอง-9และ-exz opts คุณต้องการXZ_OPT=-e9แต่ @krzyk ชี้ให้เห็นว่า -e ช้ามาก
hobs

4
เพียงแค่สำหรับบันทึก: ไม่ใช่คุณลักษณะในการดำเนินการXZ_OPT เป็นคุณลักษณะของtar xzเมื่อมีการtarโทรxzตัวแปร env จะถูกส่งผ่านไปอย่างง่ายดาย
Sven

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

ดียิ่งกว่า

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
มันจะดีกว่านี้อย่างไร การตั้งค่าสถานะ e ทำอะไร
cxdf

2
option -e, --extremeแก้ไขค่าการบีบอัดที่ตั้งไว้ล่วงหน้า (-0 ... -9) เพื่อให้อัตราส่วนการบีบอัดที่ดีขึ้นเล็กน้อยสามารถทำได้โดยไม่ต้องเพิ่มการใช้หน่วยความจำของคอมเพรสเซอร์หรือตัวขยายการบีบอัด (ยกเว้น: การใช้หน่วยความจำคอมเพรสเซอร์อาจเพิ่มขึ้นเล็กน้อยด้วยค่าที่ตั้งล่วงหน้า -0 ... -2) ข้อเสียคือเวลาการบีบอัดจะเพิ่มขึ้นอย่างมาก
Evandro Jr

ดังนั้นถ้าผมอัดเกี่ยวกับ 80GB ของซอฟแวร์ในเครื่องของฉัน (เมื่อฉันต้องการทรัพยากรคอมพิวเตอร์ที่จะไปถึงกระบวนการบีบอัดสำหรับความเร็ว) ฉันควรจะใช้-9ไม่ได้-9eใช่?
nyxee

1
xz โดยค่าเริ่มต้นใช้ 1 คอร์ / เธรดคุณสามารถขยายสูงสุด (เพิ่มความเร็วขึ้นทั้งหมด) โดยเพิ่ม -T0 เช่นXZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

หากคุณมี RAM 16 GiB (และไม่มีอะไรทำงานอีก) คุณสามารถลอง:

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

สิ่งนี้จะต้องใช้ 1.5 GiB สำหรับการคลายการบีบอัดและประมาณ 11 เท่าสำหรับการบีบอัด ปรับให้เหมาะสมตามจำนวนหน่วยความจำที่น้อยลง

นี้จะช่วยถ้าข้อมูลเป็นจริงที่ใหญ่และในกรณีใด ๆ ก็จะไม่ช่วยที่มาก แต่ยังคง ...

หากคุณกำลังบีบอัดไบนารีเพิ่ม --x86 เป็นตัวเลือก xz แรก หากคุณกำลังเล่นกับไฟล์ "มัลติมีเดีย" (ไม่มีการบีบอัดไฟล์เสียงหรือบิตแมป) คุณสามารถลองใช้ --delta = dist = 2 (ทดสอบด้วยค่าและค่าที่ดีที่ควรลองคือ 1..4)

หากคุณรู้สึกผจญภัยมากคุณสามารถลองเล่นกับตัวเลือก LZMA เพิ่มเติมเช่น

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(นี่คือการตั้งค่าเริ่มต้นคุณสามารถลองใช้ค่าระหว่าง 0 ถึง 4 และ lc + lp ต้องไม่เกิน 4)

เพื่อดูว่าค่าเริ่มต้นที่ตั้งไว้ล่วงหน้าจับคู่กับค่าเหล่านี้อย่างไรคุณสามารถตรวจสอบไฟล์ต้นฉบับ src / liblzma / lzma / lzma_encoder_presets.c ไม่มีอะไรที่น่าสนใจเท่าไหร่ (-e ตั้งค่าความยาวที่ดีเป็น 273 และปรับความลึก)


6

คุณอาจลองใช้ตัวเลือกที่แตกต่างกันสำหรับฉัน -4e ทำงานได้ดีขึ้น

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

ฉันทดสอบโดยใช้:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

ดังนั้นดูเหมือนว่าตัวเลือก -4e จะทำงานได้ดีกว่า -9e เล็กน้อย

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2

3
สิ่งนี้ไม่ได้ตอบคำถาม นี่เป็นเพียงข้อสังเกตว่าสำหรับชุดข้อมูลขนาดเล็กของคุณโดยเฉพาะ -4e จะได้รับการบีบอัดที่ดีที่สุดแล้วดังนั้นระดับที่สูงขึ้นจะไม่ได้รับประโยชน์อีกต่อไป
psusi

คุณเป็นผู้ใช้เดียวกันกับSzymon Roziewskiหรือไม่? ถ้าเป็นเช่นนั้นกรุณาอย่าโพสต์คำตอบหลายรายการ ให้แก้ไขคำตอบดั้งเดิมของคุณแทน ถ้าคุณไม่สามารถเข้าถึงบัญชีแรกของคุณ, โปรดดูที่นี่สำหรับวิธีการรวมบัญชีของคุณ ในระหว่างนี้ฉันกำลังลบคำตอบก่อนหน้าและรวมไว้ที่นี่
terdon

ตกลงฉันได้ทำการศึกษาที่ครอบคลุมมากขึ้นเกี่ยวกับเรื่องนั้น สิ่งที่ฉันได้รับอยู่ที่นี่ ฉันเลือกไฟล์บางส่วนจากฮาร์ดไดรฟ์ของฉันและทำการบีบอัดด้วยตัวเลือก -4e และ -9e ดังนั้นจึงเป็นการดีกว่าที่จะหาทางออกที่ดีที่สุดของคุณด้วยตัวเอง คุณพูดถูกสำหรับบางกรณี -9e ดีกว่าในขณะที่อีกอันไม่ใช่:no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
Szymon Roziewski

(ความคิดเห็นสามารถแก้ไขได้เพียง 5 นาที)txt 109 txt/pdf 135
Szymon Roziewski

2
+1 นี้จะช่วยให้สหกรณ์หาวิธีที่จะตรวจสอบการบีบอัดสูงสุดสำหรับไอเอ็นจีไฟล์โดยใช้tar xz
cychoi

5

tar --help : -I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

บีบอัดด้วยคอมเพรสเซอร์ภายนอก:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

ขยายคอมเพรสเซอร์ภายนอก:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

อัดรายการภายนอกคอมเพรสเซอร์:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst

1
ดูเหมือนว่าจะเป็นคำตอบที่ใช้งานได้ แต่อย่างที่มันเป็นมันจะได้รับการปรับปรุงอย่างมากโดยการจัดรูปแบบคงที่และคำอธิบายของตัวเลือกที่-Iเพิ่มเข้ามา
dhag

4

tarคำสั่งใช้การJตั้งค่าสถานะสำหรับไฟล์ xz ตัวอย่าง:

tar -cJvf foo.tar.xz foo/


2
Jถูกกล่าวถึงไปแล้วในคำตอบของ bdowning
โธ

3

สำหรับผู้ที่สนใจ-e9มีขนาดเล็กลง 0.4% บีบอัดช้าลง 20% ช้ากว่าบีบอัด 3% เมื่อเทียบ-9กับแล็ปท็อปทั่วไป นี่คือเวลาที่รันบนโครงสร้างไดเรกทอรีรหัส Python

การบีบอัด:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

การบีบอัด:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

ขนาดไฟล์:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz

1
การเลือกชื่อตัวแปรไม่ถูกต้องเนื่องจาก T0 เป็นตัวเลือกในการเปิดใช้งานการเก็บถาวรแบบมัลติเธรด
Dzenly

@Dzenly คุณพูดถูก! ขอขอบคุณ! เปลี่ยนแล้ว
เตาแก๊ส

2

นี่ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามของคุณ แต่คุณสามารถใช้คำสั่งเดียวแทนที่จะเป็นสองคำสั่ง:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

เพิ่มไฟล์ทั้งหมดจากไดเรกทอรี "dir1" เพื่อเก็บถาวร archive.7z โดยใช้ "ultras ettings"

รูปแบบอื่น ๆ ที่รองรับคือ: zip, gzip, bzip2 หรือ tar สำหรับเรื่องนี้เพียงแค่เปลี่ยนหลังจาก 7z --source-t
man 7z

หมายเหตุ: ไม่ได้ใช้คำสั่งนี้ในการสำรองข้อมูลของคุณไฟล์ระบบยกเว้นไฟล์ส่วนบุคคลเพราะรูปแบบ 7z ไม่ได้สิทธิ์ในการจัดเก็บระบบแฟ้ม


5
คำถามคือประมาณ xz ไม่ใช่ประมาณ 7z แม้ว่าพวกเขาทั้งสองจะใช้การบีบอัด LZMA
Amedee Van Gasse

2

ในเครื่องมัลติคอร์จากรุ่น v5.2.0 ของ xz-utils ให้ตรวจสอบ:

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

หากคุณต้องการใช้จำนวนคอร์สูงสุดและการบีบอัดสูงสุด:

export XZ_DEFAULTS="-9 -T 0 "

หรือตั้งค่า -T เป็นจำนวนแกนที่คุณต้องการใช้

แล้ว:

tar cJf target.tar.xz source

สิ่งนี้อาจมีประโยชน์ในการเลือกระดับการบีบอัด:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

หากคุณต้องการให้การดำเนินการเสร็จเร็วขึ้นโดยใช้หลายเธรด แต่ไม่ทำให้ระบบของคุณช้าลงในขณะที่คุณทำงานอื่นให้ลองเพิ่ม-Tnโดยที่ n คือจำนวนเธรดที่คุณต้องการใช้รวมniceถึงลดระดับการบีบอัดเพื่อไม่ใช้งาน

รุ่น (สำหรับ 4 กระทู้):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

ลองดูในtopหรือhtopเมื่อคุณทำเช่นนี้ในไดเรกทอรีขนาดใหญ่ (หลาย GB) คุณหวังว่าจะเห็นหลายxzกระทู้ด้วยค่าที่ดีของ 19 (ลำดับความสำคัญต่ำสุด)

ฉันได้แยกส่วนนี้ออกเป็นแบบสั้น ๆ ที่เหมาะสมเช่น: -f -ในคำตอบอื่น ๆ ก็ไม่จำเป็นเพราะการtarส่งออกเริ่มต้นคือ stdout

คุณสามารถniceกระบวนการ tar ด้วย แต่ฉันไม่เคยพบว่าจำเป็นเช่นxzเคยเป็นคอขวด CPU สำหรับไปป์ไลน์

จริง ๆ แล้วฉันไม่ค่อยได้ใช้xz -9อะไรเลยไม่มากเพราะ CPU หรือเวลา แต่เนื่องจากความต้องการหน่วยความจำสูง ลองดูที่https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression xzคอมเพรสเซอร์เหมือนbzip2แต่ไม่เหมือนgzip, ใช้หน่วยความจำมากขึ้นสำหรับปัจจัยการอัดสูง เมื่อรวมกับที่xzใช้หน่วยความจำมากกว่าคอมเพรสเซอร์อื่น ๆ คุณสามารถใช้หน่วยความจำ 600+ MB ได้อย่างง่ายดาย และถ้าคุณใช้การ-Tเปิดใช้งานการบีบอัดเธรดความต้องการหน่วยความจำจะเพิ่มขึ้นอีก สิ่งที่ควรระวังเช่นถ้าคุณใช้บริการขนาดเล็กบน VM ขนาดเล็กที่มีหน่วยความจำ 1-2 GB คุณอาจได้รับผลกระทบโดยไม่ตั้งใจ


1

บน Mac OS X วิธีการอื่นในการส่งผ่านพารามิเตอร์ด้วยtarคือใช้--options=แฟล็ก ตัวอย่างเช่น,

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