11 điểm bởi xguru 2021-03-16 | 4 bình luận | Chia sẻ qua WhatsApp
  • File do tar của macOS tạo ra lớn hơn 15 lần so với file tạo bằng hàm tarfile của Python

  • Nguyên nhân: BSD/GNU tar đưa các tệp vào trong file nén mà không theo thứ tự, nên tùy loại tệp mà tỷ lệ nén có thể kém hơn

Quảng cáo

→ hàm tarfile của Python mặc định có sắp xếp

  • Với GNU tar, có thể dùng tùy chọn --sort để sắp xếp theo name/inode trước khi đưa vào → khi áp dụng sắp xếp thì cho cùng tỷ lệ nén

4 bình luận

 
deadcat 2021-03-16

Mình hơi chưa hiểu, tại sao khi áp dụng sắp xếp thì tỷ lệ nén lại thay đổi nhỉ? Tỷ lệ nén của từng tệp riêng lẻ thì vẫn sẽ như nhau mà.

 
dalinaum 2021-03-22

Thuật toán đang được dùng là Deflate. Nó lưu những nội dung đã dùng để nén trước đó trong một cửa sổ trượt. Ví dụ lần này xử lý 10 byte thì 10 byte vừa xử lý sẽ được thêm vào cuối cửa sổ trượt, và kích thước của cửa sổ trượt là cố định.

Khi phát hiện nội dung trùng với nội dung trong cửa sổ trượt, nó sẽ ghi LLD (Literal, Length, Distance) thay thế để nén. Distance là vị trí trong cửa sổ trượt mà nội dung bắt đầu giống nhau, Length là độ dài phần giống nhau trong cửa sổ trượt, còn Literal là ký tự đầu tiên không giống.

Vì Deflate phụ thuộc vào việc trong cửa sổ trượt đang chứa gì, nên việc ngay trước đó có gặp nội dung tương tự hay không là rất quan trọng; nếu đã thấy các tệp tương tự thì khả năng nén tốt hơn sẽ cao hơn.

 
dalinaum 2021-03-22

Cách nén được thực hiện như thế nào thì hãy tham khảo slide bên dưới. (gzip cũng dựa trên Deflate.)

https://speakerdeck.com/dalinaum/…

 
xguru 2021-03-16

Vì nội dung của các tệp có cùng tên/tên tương tự trong cùng một thư mục sẽ giống nhau nên tỷ lệ nén sẽ cao,

có lẽ ý ở đây là phạm vi tìm các điểm giống nhau khi nén không quá rộng, nên nếu sắp xếp các tệp thì những tệp tương tự sẽ được gom lại và khả năng được nén hiệu quả hơn sẽ cao hơn.