11 คะแนน โดย xguru 2021-03-16 | 4 ความคิดเห็น | แชร์ทาง WhatsApp
  • ไฟล์ที่สร้างด้วย tarfile ของ Python มีขนาดเล็กกว่าไฟล์ที่สร้างด้วย tar บน macOS ถึง 15 เท่า

  • สาเหตุ: tar แบบ BSD/GNU ใส่ไฟล์ลงในไฟล์บีบอัดโดยไม่เรียงลำดับ จึงอาจทำให้อัตราการบีบอัดแย่ลงได้ขึ้นอยู่กับประเภทของไฟล์

โฆษณา

→ ฟังก์ชัน tarfile ของ Python เรียงลำดับเป็นค่าเริ่มต้น

  • ในกรณีของ GNU tar สามารถใช้ตัวเลือก --sort เพื่อเรียงตาม name/inode ก่อนใส่ได้ → เมื่อใช้การเรียงลำดับแล้วจะได้อัตราการบีบอัดเท่ากัน

4 ความคิดเห็น

 
deadcat 2021-03-16

ผมยังไม่ค่อยเข้าใจเท่าไร ทำไมพอใช้การจัดเรียงแล้วอัตราการบีบอัดถึงเปลี่ยนไปล่ะ ทั้งที่อัตราการบีบอัดของแต่ละไฟล์ก็น่าจะเท่าเดิม

 
dalinaum 2021-03-22

อัลกอริทึมที่ใช้อยู่คือ Deflate ครับ ซึ่งจะเก็บข้อมูลที่เคยใช้ในการบีบอัดไว้ใน sliding window สมมติว่าครั้งนี้ประมวลผลไป 10 ไบต์ ข้อมูล 10 ไบต์ที่ประมวลผลในรอบนี้ก็จะถูกเพิ่มต่อท้ายใน sliding window และขนาดของ sliding window จะคงที่

เมื่อพบเนื้อหาที่เหมือนกับสิ่งที่อยู่ใน sliding window ก็จะบีบอัดโดยเขียน LLD (Literal, Length, Distance) แทน โดย Distance คือเริ่มตรงไหนใน sliding window ที่มีเนื้อหาเหมือนกัน, Length คือความยาวของส่วนที่เหมือนกันใน sliding window, และ Literal คืออักขระตัวแรกที่ไม่เหมือนกัน

Deflate ให้ความสำคัญกับสิ่งที่เก็บอยู่ใน sliding window ดังนั้นการเพิ่งเห็นเนื้อหาที่คล้ายกันมาก่อนหรือไม่จึงสำคัญ และถ้าได้เห็นไฟล์ที่คล้ายกันมาก่อน ก็มีโอกาสที่จะบีบอัดได้ดีขึ้น

 
dalinaum 2021-03-22

วิธีการบีบอัดเป็นอย่างไร โปรดดูสไลด์ด้านล่าง (gzip ก็อิงตาม Deflate เช่นกัน)

https://speakerdeck.com/dalinaum/…

 
xguru 2021-03-16

เนื้อหาของไฟล์ที่มีชื่อเหมือนกันหรือคล้ายกันภายในโฟลเดอร์เดียวกันน่าจะคล้ายกันด้วย จึงมีแนวโน้มที่จะบีบอัดได้ดีกว่า

ดูเหมือนว่าความหมายคือ ช่วงที่ใช้ค้นหาสิ่งที่เหมือนกันระหว่างการบีบอัดไม่ได้กว้างมากนัก ดังนั้นถ้าจัดเรียงไฟล์ ก็มีโอกาสสูงขึ้นที่ไฟล์ที่คล้ายกันเหล่านี้จะถูกรวมอยู่ใกล้กันและถูกบีบอัดได้