บีบอัดไฟล์ขนาดใหญ่ที่คล้ายกันมาก


18

ฉันมีไฟล์ขนาดใหญ่ที่คล้ายกันหลายร้อยไฟล์ (30 เมกะไบต์) ซึ่งฉันต้องการบีบอัด ไฟล์ทุกคู่มีข้อมูลเดียวกัน 99% (แตกต่างน้อยกว่า 1%) ดังนั้นฉันคาดว่าจะมีไฟล์เก็บถาวรไม่เกิน 40-50 เมกะไบต์

ไฟล์เดียวสามารถบีบอัดจาก 30 ล้านบาทเป็น 13-15 ล้านบาท (มีxz -1, gz -1, bzip2 -1) แต่เมื่อบีบอัดสองคนหรือมากกว่าไฟล์ฉันต้องการจะมีที่เก็บที่มีขนาด13-15MB + N*0.3MBที่ N คือจำนวนของไฟล์

เมื่อใช้tar(การสร้างที่เก็บแข็ง) และxz -6(การกำหนดบีบอัดพจนานุกรมให้มีขนาดใหญ่กว่าหนึ่งไฟล์ - ปรับปรุง - นี้ไม่เพียงพอ ) N*13MBผมยังมีเก็บมีขนาด

ฉันคิดว่าทั้งสองgzipและbzip2จะไม่ช่วยฉันเพราะพวกเขามีพจนานุกรมน้อยกว่า 1 MB และ tar tar ของฉันมีการทำซ้ำทุก ๆ 30 MB

ฉันจะเก็บปัญหาของฉันใน Linux ที่ทันสมัยโดยใช้เครื่องมือมาตรฐานได้อย่างไร

เป็นไปได้ไหมที่จะปรับแต่งxzการบีบอัดข้อมูลที่รวดเร็ว แต่ใช้พจนานุกรมที่มีขนาดใหญ่กว่า 30-60 MB

ปรับปรุง : tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xzไม่หลอกลวงด้วย ไม่แน่ใจเกี่ยวกับความจำเป็นmf=hc4และ--memory=2Gตัวเลือก; แต่dict=128Mตั้งพจนานุกรมจะเพียงพอใหญ่ (ใหญ่กว่าหนึ่งไฟล์) และทำให้บิตกระบวนการเร็วกว่าmode=fast-e


การทำงานxz -1 --memory=2Gไม่ได้ช่วยทดสอบในไฟล์ 2 และ 4 จากชุด
osgx

คำตอบ:


12

จากรายละเอียดของคุณฉันถือว่าคุณได้ตรวจสอบแล้วว่าไฟล์ของคุณมีข้อมูล 99% เหมือนกันโดยมีความแตกต่างกัน (หรือเกือบจะติดกัน) 1% ของความแตกต่าง

ก่อนอื่นคุณควรใช้ tar เพื่อสร้างไฟล์เก็บถาวรหนึ่งไฟล์ภายในไฟล์ สำหรับการทดสอบฉันจะสร้าง. tar พร้อมไฟล์ 10 ไฟล์ดังนั้นมีขนาด 300MB

จากนั้นใช้ xz คุณต้องตั้งค่าเพื่อให้พจนานุกรมมีขนาดใหญ่กว่าขนาดของไฟล์เดียว เนื่องจากคุณไม่ได้พูดว่าคุณมีข้อ จำกัด ด้านหน่วยความจำฉันจะไปกับ xz -9 ไม่มีจุดในการไม่ใช้หน่วยความจำที่มีอยู่ทั้งหมด

ฉันยังใช้ - ดีที่สุดที่ตั้งไว้เพื่อทดสอบว่ามันสร้างความแตกต่าง

ขนาดพจนานุกรม

ในเอกสารฉบับหนึ่งที่ฉันมีอยู่ - ไซต์ - มันบอกว่าขนาดพจนานุกรมเท่ากับการใช้หน่วยความจำตัวย่อ และพารามิเตอร์ -1 หมายถึง dict ของ 1MiB, -6 หมายถึง 10 MiB (หรือ 8 MiB ในอีกส่วนหนึ่งของคู่มือเดียวกัน) นั่นเป็นเหตุผลที่คุณไม่ได้รับประโยชน์ใด ๆ จากการรวมไฟล์เหล่านั้นเข้าด้วยกัน การใช้ -9 จะทำให้ตัวถอดรหัส (และดังนั้นพจนานุกรม) เป็น 64 MiB และฉันคิดว่านั่นคือสิ่งที่คุณต้องการ

แก้ไข

ความเป็นไปได้อีกอย่างก็คือการใช้คอมเพรสเซอร์อีกอัน ฉันจะไปกับ 7zip แต่จะ tar ไฟล์เหล่านั้นก่อนแล้ว 7zip พวกเขา

ขึ้นอยู่กับเนื้อหาไฟล์ของคุณบางทีคุณอาจใช้วิธี 7zip กับ PPM-D (แทน LZMA หรือ LZMA2 ซึ่งเป็นค่าเริ่มต้นและเหมือนกับ xz ที่ใช้)

ไม่ดี: Zip (dict = 32kB), Bzip (dict = 900 kB)


ทั้ง Xz และ 7-Zip ใช้ LZMA2 ดังนั้นจึงไม่มีประโยชน์ PPMD ได้รับการปรับให้เหมาะสมสำหรับการดึงเอนโทรปีอัตราการบีบอัดที่ช้ามาก แต่สูงจากสื่อที่ถูกบีบอัดไปแล้ว (เช่น MP3 และวิดีโอ) ไม่น่าจะเป็นไปได้ที่จะพบความคล้ายคลึงกันขนาดใหญ่ระหว่างสองไฟล์และจัดเก็บไว้ในพจนานุกรม - ไม่น่าจะเป็นไปได้มากกว่า LZMA2
allquixotic

woliveirajr, สิ่งที่เกี่ยวกับการใช้ไม่ได้-1หรือที่-9ตั้งไว้, แต่ระบุdict=64MBหรือdict=128MBตั้งค่าและmode=fast?
osgx

การใช้ dict = xxMB แทนที่จะเป็น -1 หรือ -9 จะตรงไปยังจุดนั้น แต่เนื่องจากฉันไม่รู้ว่า xz ตั้งค่าพารามิเตอร์อื่น ๆ อย่างไรเมื่อคุณใช้ -9 ฉันไม่รู้ว่าคุณจะไม่พลาดอะไร อื่น. ฉันคิดว่าคุณไปในทิศทางที่ถูกต้องและการทดสอบจะให้คำตอบที่ถูกต้อง
woliveirajr

3
เมื่อxz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2Gฉันสามารถบีบอัดไฟล์ 250 ไฟล์ (7.5 GB) ถึง 18 MB tar.xz ไฟล์เก็บถาวร
osgx

@osgx :) มันค่อนข้างดี หากไม่ใช้เวลามากเกินไป (เช่นอยู่ในความต้องการของคุณ) แก้ไขปัญหาได้! :) คุณได้รับ final_size = 13MB + x * 6kB ไม่มากก็น้อย
woliveirajr

9

หากพวกเขามีความคล้ายคลึงกันอย่างแท้จริง 99% ตามที่คุณพูดคุณควรจะสามารถใช้bsdiffหรืออัลกอริทึมที่คล้ายกันเพื่อคำนวณความแตกต่างระหว่างไฟล์ ความแตกต่างสะสม (เช่นแต่ละไฟล์แตกต่างกันเล็กน้อยจากครั้งแรก) หรือเป็นความแตกต่างระหว่างสองไฟล์เหมือนกันมาก?

หากยังไม่ได้สะสมคุณควรจะสามารถ:

  • ใช้ไฟล์ใดก็ได้ในฐานะ "พื้นฐาน"
  • รันการbsdiffเปรียบเทียบไฟล์ baseline กับแต่ละไฟล์เพิ่มเติม
  • เก็บแต่ละไฟล์ต่างกันเป็นไฟล์แยกข้างไฟล์ baseline
  • เรียกใช้คอมเพรสเซอร์เช่นเดียวxzกับผล (พื้นฐาน + ความแตกต่าง)

ผลลัพธ์ควรเล็กกว่าxzการรวบรวมข้อมูลทั้งหมด

จากนั้นคุณสามารถ "สร้างใหม่" ไฟล์ต้นฉบับโดย "ใช้" ความแตกต่างที่ด้านบนของพื้นฐานเพื่อแยกไฟล์อื่น ๆ ออก


ไม่สะสม ("ไฟล์ทุกคู่มีข้อมูลเดียวกัน 99% ... ")
osgx

1
หากความแตกต่างไม่ได้สะสมนี่ควรเป็นแอปพลิเคชันที่ดีของbsdiffอัลกอริทึม ให้มันลอง.
allquixotic

ขอบคุณสำหรับคำตอบของคุณ แต่ฉันทำงานด้วย xz: tar c directory|xz --lzma2=dict=128M,mode=fastและลบไฟล์อินพุตแล้ว จริงๆแล้วไฟล์อินพุตของฉันเป็นข้อความดังนั้นฉันจึงสามารถใช้ diff แทนbsdiff(ซึ่งไม่ได้ติดตั้งบนพีซีของฉัน)
osgx

5

คุณ (I) อาจใช้ tar กับผู้จัดเก็บบางคนที่มีความสามารถในการตรวจจับรูปแบบระยะยาวตัวอย่างเช่นrzipหรือlrzip ( Readme ) ทั้งสองใช้การตรวจจับ / การทำซ้ำซ้อนระยะยาวจากนั้น rzip ใช้ bzip2 และ lrzip ใช้ xz (lzma) / ZPAQ:

rzip เป็นโปรแกรมบีบอัดคล้ายกับฟังก์ชันการทำงานกับ gzip หรือ bzip2 แต่สามารถใช้ประโยชน์จากความซ้ำซ้อนทางไกลในไฟล์ซึ่งบางครั้งอาจอนุญาตให้ rzip สร้างอัตราส่วนการบีบอัดได้ดีกว่าโปรแกรมอื่น ๆ ... ข้อได้เปรียบที่สำคัญของ rzip คือมันมีบัฟเฟอร์ประวัติที่มีประสิทธิภาพที่ 900 Mbyte ซึ่งหมายความว่าจะสามารถค้นหาส่วนต่าง ๆ ของไฟล์อินพุตในระยะทางที่ไกลกว่าเมื่อเปรียบเทียบกับโปรแกรมบีบอัดอื่น ๆ ที่ใช้กันทั่วไป โปรแกรม gzip โดยการเปรียบเทียบใช้บัฟเฟอร์ประวัติ 32 kbyte และ bzip2 ใช้บัฟเฟอร์ประวัติ 900 kbyte

lrzip มีบัฟเฟอร์ที่ใหญ่กว่าและอาจใช้อัลกอริธึมการบีบอัดจำนวนมาก (เร็วมากเร็วดีและหนึ่งในดีที่สุด - ZPAQ) หลังจากการขจัดข้อมูลซ้ำซ้อน:

Lrzip ใช้ rzip เวอร์ชันขยายซึ่งจะช่วยลดความซ้ำซ้อนของการส่งผ่านระยะไกลครั้งแรก การปรับเปลี่ยน lrzip ทำให้ปรับขนาดตามขนาดหน่วยความจำ

ข้อมูลมีดังนี้: 1. บีบอัดโดย lzma (ค่าเริ่มต้น) ซึ่งให้การบีบอัดที่ดีเยี่ยมที่ความเร็วประมาณสองเท่าของการบีบอัด bzip2 ...

วิธีอื่นคือใช้bup - โปรแกรมสำรองข้อมูลที่มีการป้องกันการซ้ำซ้อนของบล็อก / / เซกเมนต์ตาม git packfile:

มันใช้อัลกอริทึมการตรวจสอบกลิ้ง (คล้ายกับ rsync) เพื่อแยกไฟล์ขนาดใหญ่เป็นชิ้น

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