Tập tin tarring có thể cải thiện nén?


9

Có thể tarring một loạt các tập tin cùng nhau cải thiện nén với các công cụ tiêu chuẩn, ví dụ như gzip, bzip2, xz?

Tôi từ lâu đã nghĩ đây là trường hợp nhưng chưa bao giờ thử nghiệm nó. Nếu chúng ta có 2 bản sao của cùng một tệp 20Mb các byte ngẫu nhiên được ghép với nhau, một chương trình nén thông minh nhận ra điều này có thể nén toàn bộ tarball xuống gần 20Mb.

Tôi vừa thử thí nghiệm này bằng cách sử dụng gzip, bzip2 và xz để nén 1) tệp byte ngẫu nhiên, 2) tarball gồm hai bản sao của tệp đó và 3) một con mèo gồm hai bản sao của tệp đó. Trong mọi trường hợp, việc nén không làm giảm kích thước tệp. Điều này được mong đợi cho trường hợp 1 nhưng đối với trường hợp 2 và 3, kết quả tối ưu là một tệp 40Mb có thể được thu nhỏ lại gần 20Mb. Đó là một cái nhìn sâu sắc khó hiểu cho một chương trình nén, đặc biệt là vì sự dư thừa là rất xa, vì vậy tôi sẽ không mong đợi một kết quả hoàn hảo nhưng tôi vẫn cho rằng sẽ có một số nén.

Kiểm tra:

dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*

Kết quả:

20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1]   Done                    gzip -k random*
[2]-  Done                    bzip2 -k random*
[3]+  Done                    xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz

Đây có phải là những gì tôi nên mong đợi?

Có cách nào để cải thiện nén ở đây?


Trường hợp thử nghiệm của bạn là ví dụ xấu. Hãy thử làm bài kiểm tra của bạn với một thư mục gồm ~ 100 (tệp thực).
lcd047

Tại sao nó là một ví dụ xấu? Chúng tôi biết chính xác những gì mong đợi. Một tệp ngẫu nhiên không thể nén được và 2 tệp ngẫu nhiên có thể được nén một nửa.
Praxeolitic

Nội dung tập tin "ngẫu nhiên" là một vấn đề. Họ không thể ép được. Sử dụng hai tệp văn bản lớn khác nhau để có được một ý tưởng tốt hơn. Một ý tưởng liên quan ở đây là "sự khác biệt nén bình thường hóa". Bạn có thể xem ims.cuhk.edu.hk/~cis/2005.4/01.pdf để xem loại vấn đề nào bạn có thể gặp phải khi thực hiện loại thử nghiệm này.
Bruce Ediger

Câu trả lời:


11

Bạn đang chống lại "kích thước khối" của máy nén. Hầu hết các chương trình nén phá vỡ đầu vào thành các khối và nén từng khối. Có vẻ như kích thước khối bzip chỉ lên tới 900K, vì vậy nó sẽ không thấy bất kỳ mẫu nào mất nhiều hơn 900K byte để lặp lại.

http://www.bzip.org/1.0.3/html/memory-man Quản lý.html

gzip xuất hiện để sử dụng các khối 32K.

Với xz, bạn thật may mắn! Từ trang người đàn ông:

   Preset   DictSize   CompCPU   CompMem   DecMem
     -0     256 KiB       0        3 MiB    1 MiB
     -1       1 MiB       1        9 MiB    2 MiB
     -2       2 MiB       2       17 MiB    3 MiB
     -3       4 MiB       3       32 MiB    5 MiB
     -4       4 MiB       4       48 MiB    5 MiB
     -5       8 MiB       5       94 MiB    9 MiB
     -6       8 MiB       6       94 MiB    9 MiB
     -7      16 MiB       6      186 MiB   17 MiB
     -8      32 MiB       6      370 MiB   33 MiB
     -9      64 MiB       6      674 MiB   65 MiB

vì vậy "xz -8" sẽ tìm thấy tối đa 32 MB mẫu và "xz -9" lên đến 64 MB mẫu. Nhưng hãy cẩn thận với bao nhiêu ram cần thiết để thực hiện nén (và giải nén) ...


1
Đúng, xz -8 không thu nhỏ tarball và cat trong bài kiểm tra xuống 21M.
Praxeolitic

1
Có nhiều thứ hơn là kích thước khối. Nhưng toàn bộ câu chuyện không phải là thứ có thể giải thích trong một vài đoạn trên SE.
lcd047

1
@Praxeolitic Một khóa học về nén dữ liệu có thể giúp ích.
lcd047

1
@ lcd047 Nén là một chủ đề lớn nhưng câu hỏi ở đây chỉ đơn giản là "tại sao không nén này" và câu trả lời là vì nén hoạt động trên các mẫu lặp lại và mẫu mà anh ta muốn tìm thấy mất nhiều thời gian hơn bất kỳ công cụ nào đang tìm kiếm.
dataless

1
Tôi cũng nghĩ rằng thật hữu ích khi biết rằng "-9" trên hầu hết các máy nén dòng lệnh không có nghĩa là "cố gắng hơn để tìm mẫu", nó có nghĩa là "xem xét các không gian mẫu lớn hơn".
dataless

2

Các ngẫu nhiên nội dung tập tin bạn đã chọn không phải là một ví dụ điển hình - các tarfiles nén sẽ lớn hơn so với bản gốc. Bạn sẽ thấy điều tương tự với các tệp ở các định dạng đã nén (ví dụ như nhiều định dạng hình ảnh / âm thanh / video).

Nhưng việc kết hợp nhiều tệp với nội dung có thể nén thường sẽ tạo ra tổng kích thước tarfile nhỏ hơn so với khi tách riêng chúng, đặc biệt là khi nội dung tương tự nhau (ví dụ: logfiles từ cùng một chương trình). Lý do là một số dữ liệu bù nén trên mỗi tệp (như mảng mẫu cho một số thuật toán nén) có thể được chia sẻ bởi tất cả các tệp trong cùng một tarfile.



@kos Điều này phụ thuộc vào một thuật toán được sử dụng và dữ liệu. 33% được trích dẫn là cho một trường hợp rất đặc biệt. Với gzip và bzip2, tôi đo được 1000 tệp 1MB được tạo ngẫu nhiên, tăng <1% trên mỗi tệp.
jofel

2

Như đã chỉ ra:

  1. Sử dụng các tệp ngẫu nhiên là không tốt vì chúng đã chứa "entropy thông tin" tối đa, do đó sẽ không nén;
  2. Bạn cần phải đóng gói rất nhiều tập tin để so sánh công bằng.

Một trường hợp thử nghiệm tốt hơn có thể là thế này:

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(Lưu ý: Hy vọng không có thú cưỡi nào dưới đây /usr!)

Bạn có thể sử dụng tar -jcfđể nén xz thay thế.

Bây giờ nếu test2.tar.gznhỏ hơn test1.tar.gz, thì thử nghiệm thành công (nghĩa là các tệp tarring sau đó nén tốt hơn nén sau đó tarring). Tôi đoán là nó sẽ có, cho rất nhiều (tức là hàng ngàn) tệp. Nhược điểm là nó có khả năng sẽ mất nhiều thời gian hơn để thực thi, cũng như đòi hỏi nhiều không gian đĩa hơn, vì nó phải xây dựng toàn bộ tệp tar trước rồi nén nó. Đó là lý do tại sao phương thức 1 thường được sử dụng thay thế, vì nó nén từng tệp một cách nhanh chóng, mặc dù nó có thể không cho một tarball nhỏ như vậy.

Ví dụ: trong bản sao lưu ngoại vi của chúng tôi, chúng tôi thường sao lưu 4.000.000 tệp với tổng dung lượng khoảng 2TB. Vì vậy, phương pháp đầu tiên nhanh hơn rất nhiều và không cần thêm 2TB đĩa.


Không -znén kho lưu trữ (tức là tar)? Thông thường tên tệp đầu ra có czfkết thúc bằng .tar.gz để nhấn mạnh điều này.
Jari Keinänen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.