ดังนั้นฉันต้องบีบอัดไดเรกทอรีด้วยการบีบอัดสูงสุด
ฉันจะทำอย่างไรกับมันxz
? ฉันหมายความว่าฉันจะต้องเกินไปเพราะฉันไม่สามารถบีบอัดไดเรกทอรีที่มีเพียงtar
xz
มีผู้ประกอบการผลิตเองfoo.tar.xz
หรือไม่?
ดังนั้นฉันต้องบีบอัดไดเรกทอรีด้วยการบีบอัดสูงสุด
ฉันจะทำอย่างไรกับมันxz
? ฉันหมายความว่าฉันจะต้องเกินไปเพราะฉันไม่สามารถบีบอัดไดเรกทอรีที่มีเพียงtar
xz
มีผู้ประกอบการผลิตเองfoo.tar.xz
หรือไม่?
คำตอบ:
สมมติว่าxz
ให้เกียรติชุดธงมาตรฐานของ commandline - รวมถึงธงระดับการบีบอัดคุณสามารถลอง:
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
-9e
เป็นระดับที่ดีที่สุด แต่จะใช้เวลานานมาก
-9e
จะไม่ให้ผลลัพธ์ที่ดีที่สุดเสมอไป - ดูจุดที่ 8 ที่นี่rootusers.com/13-simple-xz-examples
--threads=0
ใน xz
ด้วย GNU ล่าสุดtar
บน bash หรือ shell ที่ได้รับ:
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
สวิตช์ j ตัวพิมพ์เล็กของ tar ใช้ bzip, สวิตช์ตัวพิมพ์ใหญ่ J ใช้ xz
XZ_OPT
ตัวแปรสภาพแวดล้อมช่วยให้คุณสามารถตั้งค่าตัวเลือกที่ไม่สามารถผ่านการใช้งานผ่านทางโทรเช่น xz
tar
นี่คือสูงสุดแล้ว
ดูman xz
ตัวเลือกอื่น ๆ ที่คุณสามารถตั้งค่า ( -e
/ --extreme
อาจให้ประโยชน์การบีบอัดเพิ่มเติมสำหรับชุดข้อมูลบางชุด)
XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
rc
, , และเป็นเปลือกหอยที่สำคัญที่ไม่สนับสนุนมัน ที่นั่นคุณจะใช้คำสั่ง akanga
fish
csh
tcsh
es
env
-9
และ-e
xz opts คุณต้องการXZ_OPT=-e9
แต่ @krzyk ชี้ให้เห็นว่า -e ช้ามาก
XZ_OPT
เป็นคุณลักษณะของtar
xz
เมื่อมีการtar
โทรxz
ตัวแปร env จะถูกส่งผ่านไปอย่างง่ายดาย
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
ดียิ่งกว่า
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
แก้ไขค่าการบีบอัดที่ตั้งไว้ล่วงหน้า (-0 ... -9) เพื่อให้อัตราส่วนการบีบอัดที่ดีขึ้นเล็กน้อยสามารถทำได้โดยไม่ต้องเพิ่มการใช้หน่วยความจำของคอมเพรสเซอร์หรือตัวขยายการบีบอัด (ยกเว้น: การใช้หน่วยความจำคอมเพรสเซอร์อาจเพิ่มขึ้นเล็กน้อยด้วยค่าที่ตั้งล่วงหน้า -0 ... -2) ข้อเสียคือเวลาการบีบอัดจะเพิ่มขึ้นอย่างมาก
-9
ไม่ได้-9e
ใช่?
XZ_OPT="-9e -T0" tar -cJf ...
หากคุณมี 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 และปรับความลึก)
คุณอาจลองใช้ตัวเลือกที่แตกต่างกันสำหรับฉัน -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
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
txt 109 txt/pdf 135
tar
xz
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
-I
เพิ่มเข้ามา
tar
คำสั่งใช้การJ
ตั้งค่าสถานะสำหรับไฟล์ xz ตัวอย่าง:
tar -cJvf foo.tar.xz foo/
J
ถูกกล่าวถึงไปแล้วในคำตอบของ bdowning
สำหรับผู้ที่สนใจ-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
นี่ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามของคุณ แต่คุณสามารถใช้คำสั่งเดียวแทนที่จะเป็นสองคำสั่ง:
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 ไม่ได้สิทธิ์ในการจัดเก็บระบบแฟ้ม
ในเครื่องมัลติคอร์จากรุ่น 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
สิ่งนี้อาจมีประโยชน์ในการเลือกระดับการบีบอัด:
หากคุณต้องการให้การดำเนินการเสร็จเร็วขึ้นโดยใช้หลายเธรด แต่ไม่ทำให้ระบบของคุณช้าลงในขณะที่คุณทำงานอื่นให้ลองเพิ่ม-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 คุณอาจได้รับผลกระทบโดยไม่ตั้งใจ
บน Mac OS X วิธีการอื่นในการส่งผ่านพารามิเตอร์ด้วยtar
คือใช้--options=
แฟล็ก ตัวอย่างเช่น,
tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
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 สำหรับข้อมูลเพิ่มเติม