Nén nhiều tệp lớn tương tự


18

Tôi có hàng trăm tệp lớn tương tự (mỗi tệp 30 megabyte) mà tôi muốn nén. Mỗi cặp tệp có 99% dữ liệu giống nhau (chênh lệch ít hơn 1%), vì vậy tôi hy vọng sẽ không lưu trữ quá 40-50 megabyte.

Độc tập tin có thể được nén từ 30 MB đến 13-15 MB (với xz -1, gz -1, bzip2 -1), nhưng khi nén hai hoặc nhiều file tôi muốn có kho lưu trữ với kích thước 13-15MB + N*0.3MBtrong đó N là số lượng file.

Khi sử dụng tar(để tạo lưu trữ vững chắc) và xz -6(để xác định từ điển nén lớn hơn một tệp - Cập nhật - điều này là không đủ! ), Tôi vẫn có kho lưu trữ với kích thước N*13MB.

Tôi nghĩ rằng cả hai gzipbzip2sẽ không giúp tôi vì họ có từ điển dưới 1 MB và luồng tar của tôi có số lần lặp lại cứ sau 30 MB.

Làm cách nào tôi có thể lưu trữ vấn đề của mình trong Linux hiện đại bằng các công cụ tiêu chuẩn?

Có thể điều chỉnh xzđể nén nhanh, nhưng sử dụng từ điển lớn hơn 30-60 MB?

Cập nhật : Đã lừa với tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz. Không chắc chắn về sự cần thiết mf=hc4--memory=2Gcác tùy chọn; nhưng dict=128Mđặt từ điển đủ lớn (lớn hơn một tệp) và mode=fastlàm cho quá trình nhanh hơn một chút -e.


Chạy xz -1 --memory=2Gkhông giúp được gì, đã thử nghiệm trên 2 và 4 tệp từ bộ.
osgx

Câu trả lời:


12

Đưa ra chi tiết của bạn, tôi giả định rằng bạn đã xác minh rằng các tệp của bạn thực sự có 99% dữ liệu chung, với 1% khác biệt liền kề (hoặc gần như liền kề) trong đó.

Trước tiên, bạn nên sử dụng tar để tạo một kho lưu trữ với các tệp của bạn bên trong nó. Để kiểm tra, tôi sẽ tạo một .tar với 10 tệp, để có kích thước 300MB.

Sau đó, bằng cách sử dụng xz, bạn phải đặt nó để từ điển lớn hơn kích thước của một tệp. Vì bạn không nói nếu bạn bị hạn chế bộ nhớ, tôi sẽ sử dụng xz -9. Không có điểm nào trong việc không sử dụng tất cả bộ nhớ có sẵn.

Tôi cũng sẽ sử dụng cài đặt sẵn - tối cao, để kiểm tra xem nó có khác biệt không.

Kích cỡ từ điển

Trong một tài liệu mà tôi có sẵn - trang web - người ta nói rằng kích thước từ điển gần bằng với mức sử dụng bộ nhớ giải nén. Và tham số -1 có nghĩa là một mệnh lệnh 1MiB, -6 có nghĩa là 10 MiB (hoặc 8 MiB trong một phần khác của cùng một hướng dẫn). Đó là lý do tại sao bạn không nhận được bất kỳ lợi thế nào bằng cách ghép các tệp đó lại với nhau. Sử dụng -9 sẽ làm cho bộ dịch ngược (và, vì vậy, từ điển) là 64 MiB và tôi nghĩ đó là những gì bạn muốn.

Biên tập

Một khả năng khác là sử dụng máy nén khác. Tôi sẽ sử dụng 7zip, nhưng sẽ tar các tệp đó trước rồi 7zip chúng.

Tùy thuộc vào nội dung tệp của bạn, có lẽ bạn có thể sử dụng 7zip với phương thức PPM-D (thay vì LZMA hoặc LZMA2, đó là mặc định và được sử dụng bởi xz)

Không tốt: Zip (dict = 32kB), Bzip (dict = 900 kB).


Cả Xz và 7-Zip đều sử dụng LZMA2 nên sẽ không có lợi ích gì ở đó. PPMD được tối ưu hóa để trích xuất entropy tốc độ nén cực kỳ chậm nhưng tốc độ cao từ phương tiện đã được nén (ví dụ MP3 và video). Không có khả năng đặc biệt tìm thấy sự tương đồng lớn giữa hai tệp và lưu trữ chúng trong từ điển - không nhiều hơn LZMA2.
allquixotic 18/03 '

woliveirajr, những gì về việc sử dụng không -1hoặc -9đặt trước, nhưng chỉ định dict=64MBhoặc dict=128MBvà thiết lập mode=fast?
osgx

Sử dụng dict = xxMB thay vì -1 hoặc -9 sẽ đi thẳng vào vấn đề, nhưng vì tôi không biết xz đặt các tham số khác như thế nào khi bạn chỉ sử dụng -9, tôi không biết liệu bạn có bỏ lỡ điều gì không khác Tôi nghĩ rằng bạn đang đi đúng hướng và chỉ cần thử nghiệm sẽ cho bạn câu trả lời chính xác.
woliveirajr

3
Với xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2Gtôi đã có thể nén 250 tệp (7,5 GB) thành 18 MB lưu trữ tar.xz.
osgx

@osgx :) đó là khá tốt đẹp. Nếu nó không mất quá nhiều thời gian (nghĩa là trong nhu cầu của bạn), vấn đề đã được giải quyết! :) Vì vậy, bạn đã nhận được Final_size = 13MB + x * 6kB, nhiều hay ít.
woliveirajr

9

Nếu chúng thực sự giống nhau đến 99% như bạn nói, bạn sẽ có thể sử dụng bsdiff hoặc một thuật toán tương tự để tính toán sự khác biệt giữa các tệp. Là sự khác biệt tích lũy (nghĩa là, mỗi tệp khác nhau nhiều hơn một chút so với đầu tiên), hay sự khác biệt giữa hai tệp bất kỳ khá giống nhau?

Nếu nó không được tích lũy, bạn sẽ có thể:

  • Lấy bất kỳ tập tin tùy ý làm "đường cơ sở"
  • Chạy bsdiffso sánh tệp cơ sở với từng tệp bổ sung
  • Lưu trữ mỗi diff dưới dạng một tệp riêng biệt, bên cạnh tệp cơ sở
  • Chạy một máy nén như xztrên các kết quả (đường cơ sở + khác biệt).

Kết quả sẽ nhỏ hơn nhiều so với chỉ xztoàn bộ kho lưu trữ.

Sau đó, bạn có thể "khôi phục" các tệp gốc bằng cách "áp dụng" diff trên đầu đường cơ sở để lấy từng tệp khác ra.


Không tích lũy. ("Mỗi cặp tệp có 99% dữ liệu giống nhau ...")
osgx

1
Nếu sự khác biệt không tích lũy thì đây sẽ là một ứng dụng tốt của bsdiffthuật toán. Hãy thử một lần.
allquixotic 18/03 '

Cảm ơn câu trả lời của bạn, nhưng tôi đã thực hiện nhiệm vụ với xz: tar c directory|xz --lzma2=dict=128M,mode=fastvà xóa các tệp đầu vào. Trên thực tế các tệp đầu vào của tôi là văn bản, vì vậy tôi thậm chí có thể sử dụng diff thay vì bsdiff(không được cài đặt trên PC của tôi).
osgx

5

Bạn (I) có thể sử dụng tar với một số trình lưu trữ có khả năng phát hiện mẫu tầm xa, ví dụ: rzip hoặc lrzip ( Readme ). Cả hai đều sử dụng phát hiện / sao chép dự phòng tầm xa, sau đó rzip sử dụng bzip2 và lrzip sử dụng xz (lzma) / ZPAQ:

rzip là một chương trình nén, có chức năng tương tự như gzip hoặc bzip2, nhưng có thể tận dụng sự dư thừa khoảng cách xa trong các tệp, đôi khi có thể cho phép rzip tạo ra tỷ lệ nén tốt hơn nhiều so với các chương trình khác. ... Ưu điểm chính của rzip là nó có bộ đệm lịch sử hiệu quả 900 Mbyte. Điều này có nghĩa là nó có thể tìm thấy các phần phù hợp của tệp đầu vào trong khoảng cách rất lớn so với các chương trình nén thường được sử dụng khác. Chương trình gzip bằng cách so sánh sử dụng bộ đệm lịch sử 32 kbyte và bzip2 sử dụng bộ đệm lịch sử 900 kbyte

lrzip có bộ đệm lớn hơn và có thể sử dụng nhiều thuật toán nén (rất nhanh, nhanh, tốt và một trong những thuật toán tốt nhất - ZPAQ) sau khi sao chép:

Lrzip sử dụng phiên bản mở rộng của rzip, lần đầu tiên vượt qua mức giảm dự phòng đường dài. Các sửa đổi lrzip làm cho nó chia tỷ lệ theo kích thước bộ nhớ.

Dữ liệu sau đó là: 1. Được nén bởi lzma (mặc định) cho phép nén tuyệt vời với tốc độ xấp xỉ gấp đôi tốc độ nén bzip2 ...

Một cách khác là sử dụng bup - chương trình sao lưu với sự trùng lặp cấp khối / phân khúc, dựa trên git packfile:

Nó sử dụng thuật toán tổng kiểm tra (tương tự rsync) để chia các tệp lớn thành các khối.

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.